在Spring Security中定制身份验证

多纳尔

在我的Grails应用中,我使用的是Spring Security插件,并定义了一个自定义userDetailsS​​ervice Spring bean,以便控制如何检索用户和角色数据,例如

class MyUserDetailsService implements GrailsUserDetailsService {

    /**
     * Some Spring Security classes (e.g. RoleHierarchyVoter) expect at least one role, so
     * we give a user with no granted roles this one which gets past that restriction but
     * doesn't grant anything.
     */
    static final List NO_ROLES = [new GrantedAuthorityImpl(SpringSecurityUtils.NO_ROLE)]

    UserDetails loadUserByUsername(String username, boolean loadRoles) {
        return loadUserByUsername(username)
    }

    UserDetails loadUserByUsername(String username) {
        User.withTransaction { status ->

            User user = User.findByUsername(username)
            if (!user) {
                throw new UsernameNotFoundException('User not found', username)
            }

            def authorities = user.authorities.collect {new GrantedAuthorityImpl(it.authority)}
            return new CustomUserDetails(
                    user.username,
                    user.password,
                    user.enabled,
                    !user.accountExpired,
                    !user.passwordExpired,
                    !user.accountLocked,
                    authorities ?: NO_ROLES,
                    user.id,
                    user.name)
        }
    }
}

CustomUserDetails上面引用类仅扩展GrailsUser了一个name字段:

class CustomUserDetails extends GrailsUser {

    private static final long serialVersionUID = 1;

    final String name

    CustomUserDetails(String username,
                      String password,
                      boolean enabled,
                      boolean accountNonExpired,
                      boolean credentialsNonExpired,
                      boolean accountNonLocked,
                      Collection<GrantedAuthority> authorities,
                      long id,
                      String displayName) {

        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities, id)
        this.name = displayName
    }
}

除了自定义如何检索用户和角色数据外,我还想控制如何对用户进行身份验证。在我的情况下,身份验证过程并不像通常的“检查输入的密码是否与数据库中的密码匹配”那样简单。验证用户身份的实际细节无关紧要,因此,为简单起见,我们假设如果用户name字段与输入的密码匹配,那么他将被授予封装在中的角色(权限)CustomUserDetails

我想插件中的某个地方可以覆盖Spring Bean,以便自定义默认身份验证机制,但是哪一个呢?因为该name字段仅由定义CustomUserDetails,所以我将需要访问返回的此类的实例MyUserDetailsService才能执行自定义身份验证,这可能吗?

伯特·贝克维斯

我在这里讨论了自定义登录,示例应用程序具有代码:http : //burtbeckwith.com/blog/?p=1090

但是,如果您只想给用户授予与数据库中不同的角色,我将在中执行MyUserDetailsService不需要角色在数据库中-Spring Security只需要一堆GrantedAuthorityImpl实例。在一个应用程序中,我在身份验证期间自动将ROLE_USER授予常规站点用户,以避免浪费数据库空间。

编辑:

如果您使用的是DaoAuthenticationProvider,则可以通过自定义preAuthenticationChecksand和/或postAuthenticationChecksbean在身份验证期间添加其他检查从插件中对它们进行子类化,并添加您自己的检查,然后将其注册到resources.groovy中。

preAuthenticationChecks(MyPreAuthenticationChecks)
postAuthenticationChecks(MyPostAuthenticationChecks)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring Security中的链式身份验证

来自分类Dev

用于“不支持身份验证方法:GET”的Spring Security定制消息

来自分类Dev

Spring Security 4.具有定制身份验证和授权的JSON REST

来自分类Dev

如何在Spring Security中撤消身份验证令牌?

来自分类Dev

为什么在Spring Security中对“ anonymousUser”进行身份验证?

来自分类Dev

从服务中获取Spring Security身份验证

来自分类Dev

在Spring Security中接收令牌的基本身份验证

来自分类Dev

如何在Spring Security中关闭Websocket的身份验证?

来自分类Dev

在Spring Security中接收令牌的基本身份验证

来自分类Dev

在 Spring Security 中捕获身份验证失败

来自分类Dev

Tomcat身份验证和Spring Security

来自分类Dev

使用UserDetailsService的Spring Security身份验证

来自分类Dev

Spring Security Rest Basic身份验证

来自分类Dev

身份验证失败的Spring Security Wildfly

来自分类Dev

Spring Security在身份验证和未经身份验证的用户中获得REST服务中的用户信息

来自分类Dev

Spring MVC REST + Spring Security +基本身份验证

来自分类Dev

使用Spring Security + Spring数据+ MongoDB进行身份验证

来自分类Dev

经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

来自分类Dev

为什么故障处理在Spring Security X.509身份验证中不起作用?

来自分类Dev

使用REST和Javaconfig的Spring Security中的摘要式身份验证

来自分类Dev

Spring Security 3.1中如何处理不同的身份验证异常?

来自分类Dev

Spring Security:在Servlet过滤器中访问当前经过身份验证的用户

来自分类Dev

如何在Spring WebFlux Security中实现多种身份验证方法?

来自分类Dev

经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

来自分类Dev

如何在Spring Security中通过email_id或contact_number进行身份验证?

来自分类Dev

在Spring Security中无法通过email_id对用户进行身份验证

来自分类Dev

在Spring Security中设置自定义身份验证和角色

来自分类Dev

Spring Security-基于令牌的API身份验证和用户/密码身份验证

来自分类Dev

Spring Security身份验证提供程序Java配置

Related 相关文章

  1. 1

    Spring Security中的链式身份验证

  2. 2

    用于“不支持身份验证方法:GET”的Spring Security定制消息

  3. 3

    Spring Security 4.具有定制身份验证和授权的JSON REST

  4. 4

    如何在Spring Security中撤消身份验证令牌?

  5. 5

    为什么在Spring Security中对“ anonymousUser”进行身份验证?

  6. 6

    从服务中获取Spring Security身份验证

  7. 7

    在Spring Security中接收令牌的基本身份验证

  8. 8

    如何在Spring Security中关闭Websocket的身份验证?

  9. 9

    在Spring Security中接收令牌的基本身份验证

  10. 10

    在 Spring Security 中捕获身份验证失败

  11. 11

    Tomcat身份验证和Spring Security

  12. 12

    使用UserDetailsService的Spring Security身份验证

  13. 13

    Spring Security Rest Basic身份验证

  14. 14

    身份验证失败的Spring Security Wildfly

  15. 15

    Spring Security在身份验证和未经身份验证的用户中获得REST服务中的用户信息

  16. 16

    Spring MVC REST + Spring Security +基本身份验证

  17. 17

    使用Spring Security + Spring数据+ MongoDB进行身份验证

  18. 18

    经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

  19. 19

    为什么故障处理在Spring Security X.509身份验证中不起作用?

  20. 20

    使用REST和Javaconfig的Spring Security中的摘要式身份验证

  21. 21

    Spring Security 3.1中如何处理不同的身份验证异常?

  22. 22

    Spring Security:在Servlet过滤器中访问当前经过身份验证的用户

  23. 23

    如何在Spring WebFlux Security中实现多种身份验证方法?

  24. 24

    经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

  25. 25

    如何在Spring Security中通过email_id或contact_number进行身份验证?

  26. 26

    在Spring Security中无法通过email_id对用户进行身份验证

  27. 27

    在Spring Security中设置自定义身份验证和角色

  28. 28

    Spring Security-基于令牌的API身份验证和用户/密码身份验证

  29. 29

    Spring Security身份验证提供程序Java配置

热门标签

归档