vlambda博客
学习文章列表

读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

在本章中,我们将介绍:

  • 使用 @preAuthorize 注释的带有 Hibernate 的 Spring Security

  • Spring Security with Hibernate 使用带有 @preAuthorize 注释的身份验证提供程序

  • Spring Security with Hibernate 使用用户详细信息服务和 Derby 数据库

  • MongoDB 的 Spring 安全性

介绍


Spring 框架被设计成可以轻松地与类似 Mybatis、Hibernate 等的 ORM 框架集成。 Hibernate 教程有很好的文档记录,可以在 JBoss 网站上找到。 Hibernate 为我们提供了数据持久性。

在本章中,我们将了解如何将 Spring Security 与 ORM 框架集成。我们还将 Spring Security 与最新的 MongoDB 集成。

我们将首先使用 Hibernate 和 Spring 进行一些基本设置。由于本章包含与数据库相关的内容,我们需要为本章中使用的所有配方创建一个数据库。我正在使用带有 Maven 的 NetBeans IDE。我觉得 NetBeans IDE 与其他 IDE 相比非常先进。

设置 Spring Hibernate 应用程序

我们将 创建一个简单的恐怖电影应用程序,它会显示带有一些CRUD 创建、读取、更新和删除)功能。设置 Spring Hibernate 应用程序涉及以下步骤:

  1. 在 Derby 中创建一个 horrormoviedb 数据库。您可以使用 NetBeans。

  2. 点击 Services 标签,您将看到 Databases

  3. 右键点击JavaDB查看创建数据库... 选项。选择 创建数据库... 选项。

    读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
  4. 在数据库 horrormovie 中创建一个表。

    读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
  5. 在表中创建 列并将这些列命名为horrormovie_id, horrormovie_name horrormovie_director

  6. 创建一个 maven 项目,使用 Spring、Hibernate、Derby 和 Spring Security 依赖项更新 POM,并在 NetBeans IDE 中打开它。

  7. 使用 @table@column 注释创建实体类。

  8. 创建一个 DAODAOImpl 类来处理休眠操作。

  9. 创建一个 ServiceServiceImpl 类,以充当 DAO 和用户界面。

  10. 创建一个控制器来处理 UI 部分。

使用 @preAuthorize 注释的带有 Hibernate 的 Spring Security


在当前的 演示中,我们使用了两个不同的 数据库。身份验证管理器配置有 tenant1DataSource,它连接到保存用户和角色信息的 Derby 数据库。使用此数据源,我们将进行身份验证和授权。

为了显示 horrormovie 列表,我们在 Derby 中创建了另一个数据源,它与 Hibernate 配置文件一起使用。

DAOImpl 类方法中,我们使用 @preAuthorize 注释。

让我们使用 GlassFish 应用程序服务器来运行应用程序。

准备好

  • 编辑 application-security.xml

  • 编辑 horrormovie-servlet.xml

  • DAOImpl 中使用 @preAuthorize 注解。 Spring Security 在调用方法时授权用户。

怎么做...

以下步骤将使用 Hibernate 应用程序进行身份验证和授权:

  1. 使用数据源详细信息和 Bean 信息编辑 application-security.xml 文件。

    <global-method-security pre-post-annotations="enabled" />
    
      <http auto-config="false" use-expressions="true">
        <intercept-url pattern="/login" access="permitAll" />
        <intercept-url pattern="/logout" access="permitAll" />
        <intercept-url pattern="/accessdenied" access="permitAll" />
        <intercept-url pattern="/**"access="hasRole('ROLE_EDITOR')" />
        <form-login login-page="/login" default-target-url="/list" authentication-failure-url="/accessdenied" />
        <logout logout-success-url="/logout" />
      </http>
    
      <authentication-manager alias="authenticationManager">
        <authentication-provider>
          <jdbc-user-service data-source-ref="tenant1DataSource" users-by-username-query=" select username,password ,'true' as enabled from users where username=?" authorities-by-username-query=" select u.username as username, ur.authority as authority from users u, user_roles ur where u.user_id = ur.user_id and u.username =?" /> 
        </authentication-provider>
      </authentication-manager>
    
      <beans:bean id="horrorMovieDAO" class="com.packt.springsecurity.dao.HorrorMovieDaoImpl" />
      <beans:bean id="horrorMovieManager" class="com.packt.springsecurity.service.HorrorMovieManagerImpl" />
      <beans:bean id="tenant1DataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <beans:property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
      <beans:property name="url" value="jdbc:derby://localhost:1527/client1" />
      <beans:property name="username" value="client1" />
      <beans:property name="password" value="client1" />
    
    </beans:bean>
  2. 使用 horrormovie-servlet.xml 文件 > 控制器信息。

    <global-method-security pre-post-annotations="enabled" />
    
      <http auto-config="true">
        <intercept-url pattern="/spring-security-wicket/**" access="ROLE_SELLER"/>
        <intercept-url pattern="/spring-security-wicket/*.*" access="ROLE_SELLER"/> 
        <intercept-url pattern="/**" access="ROLE_SELLER" />
      <http-basic />
    </http>
    <authentication-manager> 
      <authentication-provider> 
        <jdbc-user-service data-source-ref="MySqlDS" users-by-username-query=" select username,password, enabled from users1 where username=?" authorities-by-username-query=" select u.username, ur.role from users1 u, user_roles ur where u.user_id = ur.user_id and u.username =? " /> 
      </authentication-provider>
    </authentication-manager>

    它使用 JDBC 进行身份验证服务。

  3. 执行 addHorrorMovie 方法时使用注解 Spring 检查 凭据的安全 上下文对象并进行身份验证和授权;这在以下代码中给出:

    @Repository
    public class HorrorMovieDaoImpl implements HorrorMovieDAO  {
    
      @Autowired
      private SessionFactory sessionFactory;
    
      @PreAuthorize("hasRole('ROLE_AUTHOR')")
      @Override
      public void addHorrorMovie(HorrorMovieEntity horrormovie) {
        this.sessionFactory.getCurrentSession().save(horrormovie);
      }
    
      @SuppressWarnings("unchecked")
      @Override
      public List<HorrorMovieEntity> getAllHorrorMovies() {
        return this.sessionFactory.getCurrentSession().createQuery("from HORRORMOVIE").list();
      }
    
      @Override
      public void deleteHorrorMovie(Integer horrorMovieId) {
        HorrorMovieEntity horrorMovie = (HorrorMovieEntity)sessionFactory.getCurrentSession().load(HorrorMovieEntity.class, horrorMovieId);
        if (null != horrorMovie) {
          this.sessionFactory.getCurrentSession().delete(horrorMovie);
        }
      }
    }
  4. 一些SQL命令如下:

    create table HORRORMOVIE
      (HORRORMOVIE_ID int generated by default as identity 
        (START WITH 2, INCREMENT BY 1),
      HORRORMOVIE_NAME char(50),HORRORMOVIE_DIRECTOR char(50));
    
    insert into HORRORMOVIE values 
      (1, 'EVILDEAD','Fede Alvarez');
    insert into HORRORMOVIE values 
      (DEFAULT, 'EVILDEAD2','Fede Alvarez');
    

这个怎么运作...

在此示例中,我们创建了一个Hibernate应用程序并使用JDBC服务进行身份验证. Spring 框架中断访问应用程序的请求并请求用户输入凭据。使用 application-security.xml 文件中提供的 JDBC 详细信息对凭据进行身份验证。

成功后,用户将被重定向到显示电影列表的应用程序。

现在访问以下 URL:

http://localhost:8080/login

使用 JDBC 服务进行认证和授权以及在方法上使用注解应用 Spring Security 的截图如下:

该示例的工作流程显示在以下屏幕截图中:

读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

也可以看看

  • Spring Security with Hibernate using authentication provider配方

  • Spring Security with Hibernate 使用用户详细信息服务和 Derby 数据库 配方

  • Spring Security with MongoDB 秘诀

Spring Security with Hibernate 使用带有 @preAuthorize 注释的身份验证提供程序


我们 正在使用示例horrormovie 应用程序< /a> 使用自定义身份验证提供程序和 @preAuthorize 注释来演示带有 Hibernate 的 Spring Security。

在这个秘籍中,我们将创建自己的自定义身份验证提供程序并实现接口身份验证提供程序。我们将在 controller 方法上应用注解,而不是 hibernate 的 方法。

准备好

  • 创建一个实现 AuthenticationProvider 接口的新类,并将 Bean 定义添加到 application-security.xml 文件

  • 编辑 application-security.xml 文件

  • 在控制器中使用 @preAuthorize 注释

怎么做...

以下步骤用于使用 AuthenticationProvider 接口实现 Spring Security:

  1. 使用数据源详细信息和 Bean 信息编辑 application-security.xml 文件。

    <global-method-security pre-post-annotations="enabled" />
    
    <http auto-config="false" use-expressions="true">
      <intercept-url pattern="/login" access="permitAll" />
      <intercept-url pattern="/logout" access="permitAll" />
      <intercept-url pattern="/accessdenied" access="permitAll"/>
      <intercept-url pattern="/list" access="hasRole('ROLE_EDITOR')" />
      <intercept-url pattern="/add" access="hasRole('ROLE_EDITOR')" />
      <form-login login-page="/login" default-target-url="/list" authentication-failure-url="/accessdenied" />
      <logout logout-success-url="/logout" />
    </http>
    
    
      <authentication-manager alias="authenticationManager">
      <authentication-provider ref="MyCustomAuthenticationProvider" />
      </authentication-manager>
    
      <beans:bean id="horrorMovieDAO" class="com.packt.springsecurity.dao.HorrorMovieDaoImpl" />
      <beans:bean id="horrorMovieManager" class="com.packt.springsecurity.service.HorrorMovieManagerImpl"/>
    
      <beans:bean id="MyCustomAuthenticationProvider" class="com.packt.springsecurity.controller" />
    </beans:beans>
  2. 编辑 MyCustomAuthenticationProvider 文件.

    public class MyCustomAuthenticationProvider implements AuthenticationProvider {
      @Override
      public boolean supports(Class<? extends Object>authentication)
    {
        return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
        }
    
      private static Map<String, String> APP_USERS= new HashMap<String, String>(2);
      private static List<GrantedAuthority> APP_ROLES= new ArrayList<GrantedAuthority>();
      static
      {
        APP_USERS.put("ravi", "ravi123");
        APP_USERS.put("chitra", "chitra123");
        APP_ROLES.add(new SimpleGrantedAuthority("ROLE_EDITOR"));
      }
    
      @Override
      public Authentication authenticate(Authentication auth)
      {
        if (APP_USERS.containsKey(auth.getPrincipal())
        && APP_ROLES.get(auth.getPrincipal()).equals(auth.getCredentials()))
        {
          return new UsernamePasswordAuthenticationToken(auth.getName(), auth.getCredentials(),
            AUTHORITIES);
        }
        throw new BadCredentialsException("Username/Password does not match for "
          + auth.getPrincipal());
        }
      }
    }
  3. 在控制器中使用 注释

    AddHorrorMovieController
    @PreAuthorize("hasRole('ROLE_EDITOR')")
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addHorrorMovie(
      @ModelAttribute(value = "horrorMovie") HorrorMovieEntity horrorMovie,
        BindingResult result) {
        horrorMovieManager.addHorrorMovie(horrorMovie);
        return "redirect:/list";
      }

这个怎么运作...

现在访问以下 URL:

http://localhost:8080/login

中断请求后,Spring Security 调用 MyCustomAuthenticationProvider,它具有用于身份验证的覆盖的 authenticate 方法以及用户信息。用户凭据通过 APP_Users 映射中的凭据进行身份验证和授权,成功的身份验证和授权用户将被重定向到 中配置的成功 URL spring-security.xml 文件。

使用自定义身份验证提供程序进行身份验证和授权以及在控制器中的方法上使用注释应用 Spring Security 的屏幕截图如下:

读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

也可以看看

  • Spring Security with Hibernate using @preAuthorize annotation 配方

  • Spring Security with Hibernate 使用带有 @preAuthorize 注释的自定义身份验证提供程序 配方

  • Spring Security with Hibernate 使用用户详细信息服务和 Derby 数据库 配方

  • Spring Security with MongoDB 秘诀

Spring Security with Hibernate 使用 UserDetailsS​​ervice 和 Derby 数据库


到目前为止,我们已经看到了 Hibernate 和 Spring 各种身份验证提供程序的安全性。在本节中,我们将使用 Hibernate 从数据库中检索用户和权限。

为此,我们将实现 UserDetailsS​​ervice 接口并在接口中实现一个方法。首先,我们需要为用户和角色创建实体类。

我们还@preAuthorize 注解移至 controller 类。

准备好

  • 创建一个实现 UserDetailsS​​ervice 接口的新类,并将 Bean 定义添加到 application-security.xml 文件

  • 编辑 application-security.xml 文件

  • 在控制器中使用 @preAuthorize 注释

  • 在恐怖数据库中添加表 USERSUSER_ROLE

  • 插入角色 ROLE_EDITOR 和名为 raviravi123 的用户

怎么做...

以下步骤用于通过实现与 Hibernate 方法交互的 UserDetailsS​​ervice 接口将 Spring Security 身份验证与 Hibernate 集成:

  1. 创建一个实现 UserDetailsS​​ervice 接口的类 MyUserDetailsS​​ervice

    public class MyUserDetails implements UserDetailsService {
      @Autowired
      private UsersDAO UsersDAO;
      public UserDetails loadUserByUsername(String userName)
      throws UsernameNotFoundException {
    
        Users users= UsersDAO.findByUserName(userName);
        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;
        return new User(
          users.getUserName(), 
          users.getUserPassword(), 
          enabled, 
          accountNonExpired, 
          credentialsNonExpired, 
          accountNonLocked,
          getAuthorities(users.getRole().getRoleId().intValue()));
        }
    
        public Collection<? extends GrantedAuthority>getAuthorities(Integer role) {
        List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role));
        System.out.println("authList----------->"+authList);
        return authList;
      }
    
      public List<String> getRoles(Integer role) {
    
        List<String> roles = new ArrayList<String>();
    
        if (role.intValue() == 1) {
          roles.add("ROLE_EDITOR");
        } else if (role.intValue() == 2) {
          roles.add("ROLE_AUTHOR");
        }
        return roles;
      }
    
      public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
      List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
      for (String role : roles) {
        System.out.println("role----------->"+role);
        authorities.add(new SimpleGrantedAuthority(role));
      }
      return authorities;
      }
    
    }
  2. 编辑 application-security.xml < /a> 文件。

    <authentication-manager alias="authenticationManager">
      <authentication-provider user-service-ref="MyUserDetails">
        <password-encoder hash="plaintext" />
      </authentication-provider>
    </authentication-manager>
    
    
    <beans:bean id="horrorMovieDAO" class="com.packt.springsecurity.dao.HorrorMovieDaoImpl" />
    <beans:bean id="horrorMovieManager" class="com.packt.springsecurity.service.HorrorMovieManagerImpl" />
    <beans:bean id="UsersDAO" class="com.packt.springsecurity.dao.UsersDAOImpl" />
    <beans:bean id="UsersManager" class="com.packt.springsecurity.service.UsersManagerImpl" />
    <beans:bean id="UserRoleDAO" class="com.packt.springsecurity.dao.UserRoleDAOImpl" />
    <beans:bean id="UserRoleManager" class="com.packt.springsecurity.service.UserRoleManagerImpl" />
    
    
    <beans:bean id="MyUserDetails" class="com.packt.springsecurity.service.MyUserDetails" />
    </beans:beans>
  3. 控制器中使用注解

    @PreAuthorize("hasRole('ROLE_EDITOR')")
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addHorrorMovie(
      @ModelAttribute(value = "horrorMovie")HorrorMovieEntity horrorMovie,
      BindingResult result) {
        horrorMovieManager.addHorrorMovie(horrorMovie);
        return "redirect:/list";
      }

这个怎么运作...

现在访问以下 URL:

http://localhost:8080/login

首先,我们使用 UserDetailsS​​ervice 和 Hibernate 进行身份验证和授权。 UserDetailsS​​ervice 是一个 Spring Security 接口,由 MyUserDetailsS​​ervice class< /a>。此类在 application-security.xml 文件中配置,以便 Spring Security 调用此实现类以使用 Hibernate 加载用户详细信息。 UsersDAO.findByUserName(userName) 是调用Hibernate根据传入的用户名获取用户信息的方法。

使用 注解将 Spring Security 应用到 控制器后,我们应该可以登录了使用用户名和密码(ravi 和 ravi123)。 <password-encoder hash="plaintext" /> 是 Spring Security 支持的哈希算法。成功验证后,用户将被重定向到授权页面。

以下屏幕截图演示了应用程序的工作流程:

读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

也可以看看

  • Spring Security with Hibernate using @preAuthorize annotation 配方

  • Spring Security with Hibernate 使用带有 @preAuthorize 注释的自定义身份验证提供程序 配方

  • Spring Security with Hibernate 使用用户详细信息服务和 Derby 数据库 配方

  • Spring Security with MongoDB 秘诀

MongoDB 的 Spring 安全性


在这个 部分 让我们看看 Spring Security 如何与 MongoDB 一起工作。 MongoDB 是一种流行的 NOSQL 数据库。它是一个基于文档的数据库。 MongoDB 是用流行的 C++ 数据库编写的,这使其成为一个面向对象的基于文档的数据库。在 MongoDB 中,查询也是基于文档的,它还提供使用 JSON 样式的索引来存储和检索数据。 可用的最新 Spring 版本是 3.2 版已包含在 POC 中。

准备好

  • 下载 MongoDB 数据库

  • 配置数据文件夹

  • 在命令提示符下启动 MongoDB

  • 在另一个命令提示符下启动 MongoDB

  • 通过向其中插入数据来创建 horrordb 数据库

  • 执行命令使用恐怖数据库

  • MongoDB 依赖添加到 POM (项目对象模型)文件

  • 将 JSON 依赖项添加到 POM 文件

  • 将 Spring 版本升级到 3.2.0,将 Spring Security 升级到 1.4

  • 创建一个 MongoUserDetails

  • 编辑 horror-movie servlet

  • 编辑 Application-security.xml 文件

怎么做...

以下步骤使用 Mongo 和 Spring Security 通过实现 UserDetailsS​​ervice 接口对用户进行身份验证和授权:

  1. 命令提示符下的数据库操作如下图所示:

    db.horrormovie.insert({horrormovie_id:1,horrormovie_name:
      "omen",horrormovie_director:"Richard Donner"})
    
    db.horrormovie.insert({horrormovie_id:2,horrormovie_name:
      "the conjuring",horrormovie_director:"James Wan"})
    
    db.horrormovie.insert({horrormovie_id:3,horrormovie_name:
      "The Lords of Salem",horrormovie_director:"Rob Zombie"})
    
    db.horrormovie.insert({horrormovie_id:4,horrormovie_name:
      "Evil Dead",horrormovie_director: "Fede Alvarez"})
    
    db.users.insert({id:1,username:"anjana",password:
      "123456",role:1})
    
    db.users.insert({id:2,username:"raghu",password:
      "123456",role:2})
    
    db.users.insert({id:3,username:"shami",password:
      "123456",role:3})
    
  2. 创建一个MongoUserDetailsS​​ervice 其中 实现 UserDetailsS​​ervice 接口。

    @Service
    public class MongoUserDetailsService implements UserDetailsService {
    
      @Autowired
      private UserManager userManager;
      private static final Logger logger = Logger.getLogger(MongoUserDetailsService.class);
      private org.springframework.security.core.userdetails.User userdetails;
      public UserDetails loadUserByUsername(String username)
      throws UsernameNotFoundException {
        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;
        Users users = getUserDetail(username);
        System.out.println(username);
        System.out.println(users.getPassword());
        System.out.println(users.getUsername());
        System.out.println(users.getRole());
    
        return new User(users.getUsername(), users.getPassword(),enabled,accountNonExpired,credentialsNonExpired,accountNonLocked,getAuthorities(users.getRole()));
      }
    
      public List<GrantedAuthority> getAuthorities(Integer role) {
        List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
          if (role.intValue() == 1) {
            authList.add(new SimpleGrantedAuthority("ROLE_EDITOR"));
    
          } else if (role.intValue() == 2) {
            authList.add(new SimpleGrantedAuthority("ROLE_AUTHOR"));
        }
        return authList;
      }
    
      public Users getUserDetail(String username) {
      Users users = userManager.findByUserName(username);
      System.out.println(users.toString());
      return users;
    }
  3. 编辑 application-security.xml< /代码>。

    <global-method-security pre-post-annotations="enabled" />
    
    <http auto-config="false" use-expressions="true">
      <intercept-url pattern="/login" access="permitAll" />
      <intercept-url pattern="/logout" access="permitAll" />
      <intercept-url pattern="/accessdenied" access="permitAll" />
      <intercept-url pattern="/list" access="hasRole('ROLE_EDITOR')" />
    <!-- <http-basic/>-->
      <form-login login-page="/login" default-target-url="/list" authentication-failure-url="/accessdenied" />
      <logout logout-success-url="/logout" />
    </http>
    
    <authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="mongoUserDetailsService">
    <password-encoder hash="plaintext" />
    </authentication-provider>
    </authentication-manager>
  4. 编辑 horrormovie-servlet.xml

    <context:annotation-config />
    <context:component-scan base-package="com.packt.springsecurity.mongodb.controller" />
    <context:component-scan base-package="com.packt.springsecurity.mongodb.manager" />
    <context:component-scan base-package="com.packt.springsecurity.mongodb.dao" />
    <context:component-scan base-package="com.packt.springsecurity.mongodb.documententity" />
    
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
      <property name="prefix" value="/WEB-INF/view/" />
      <property name="suffix" value=".jsp" />
    </bean>
    <mongo:mongo host="127.0.0.1" port="27017" />
    <mongo:db-factory dbname="horrordb" />
    
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    </bean>
    
    <bean id="horrorMovieDAO" class="com.packt.springsecurity.mongodb.dao.HorrorMovieDaoImpl" />
    <bean id="horrorMovieManager" class="com.packt.springsecurity.mongodb.manager.HorrorMovieManagerImpl" />
    <bean id="UsersDAO" class="com.packt.springsecurity.mongodb.dao.UsersDAOImpl" />
    <bean id="userManager" class="com.packt.springsecurity.mongodb.manager.UserManagerImpl" />
    <bean id="mongoUserDetailsService" class="com.packt.springsecurity.mongodb.controller.MongoUserDetailsService" />
    
    <bean id="HorroMovieController" class="com.packt.springsecurity.mongodb.controller.HorrorMovieController" />
  5. 在控制器中使用 注释

    @PreAuthorize("hasRole('ROLE_EDITOR')")
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addHorrorMovie(
    @ModelAttribute(value = "horrorMovie")HorrorMovieEntity horrorMovie,
      BindingResult result) {
      horrorMovieManager.addHorrorMovie(horrorMovie);
      return "redirect:/list";
    }

这个怎么运作...

首先,我们使用 MongoDetailsS​​ervice 和 Spring 数据进行身份验证和授权。 MongoDetailsS​​erviceUserDetailsS​​ervice的实现,getUserDetail(string username)调用springdata根据传递的用户名从 Mongo 数据库获取用户凭据。如果数据基于用户名存在,则表示身份验证成功。然后我们使用注解在控制器方法上应用 Spring Security。

现在我们应该能够使用用户名和密码(ravi 和 123456)登录。

现在访问以下 URL:

http://localhost:8080/login

以下屏幕截图演示了该工作流程:

读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security
读书笔记《spring-security-3-x-cookbook》第 8 章使用 ORM 和 NoSQL DB 的 Spring Security

也可以看看

  • Spring Security with Hibernate using @preAuthorize annotation 配方

  • Spring Security with Hibernate 使用带有 @preAuthorize 注释的自定义身份验证提供程序 配方

  • Spring Security with Hibernate 使用用户详细信息服务和 Derby 数据库 配方

  • Spring Security with MongoDB 秘诀