2 Spring Security中的UserDomainClass

Posted

技术标签:

【中文标题】2 Spring Security中的UserDomainClass【英文标题】:2 UserDomainClass in Spring Security 【发布时间】:2015-06-28 03:37:34 【问题描述】:

在现有的 Grails 应用程序中,我有 2 个用户域,例如 UserAdmin 和 UserBasic。这两个域都有很少的公共字段和一些不同的字段(相对于域),目前登录/注销是分别使用两种类型的用户的会话来维护的。我想将 spring-security 集成到现有应用程序中。

最好的方法是什么?考虑到两个领域也有不同的领域。我们可以继承单个域中的两个域并将其用作 Spring Security 用户类吗?请提出建议。

【问题讨论】:

【参考方案1】:

Spring Security Core 使用UserDetails 接口的实现之一作为经过身份验证的用户的投影。 Grails 提供例如GrailsUser类:

https://github.com/grails-plugins/grails-spring-security-core/blob/master/src/java/grails/plugin/springsecurity/userdetails/GrailsUser.java

请记住,就 Grails 应用程序布局而言,此类不是“域”类 - 它不会持久保存在数据库中,它只是绑定到当前会话的用户的投影。

如果您有 2 个不同的域类代表您的应用程序中的用户,您可以尝试提供自己的 UserDetailsService 实现,例如

class CustomUserDetailsService implements UserDetailsService 

    @Override
    UserDetails loadUserByUsername(String s) throws UsernameNotFoundException 

        // 1. Check if expected user is type of UserBasic
        // 2. If not, check if expected user is type of UserAdmin
        // 3. If nothing found, throw an exception
        // 4. Otherwise create new GrailsUser instance using UserBasic or UserAdmin data
        // 5. Return created GrailsUser instance

        return null
    

然后您必须通过添加或修改 grails-app/conf/spring/resources.groovy 中的条目来注入您的实现,例如

// Place your Spring DSL code here
beans = 
    // other beans goes here
    // ...

    userDetailsService(CustomUserDetailsService)

这只是一个你可以开始的概念。

【讨论】:

谢谢希蒙!我会调查的。

以上是关于2 Spring Security中的UserDomainClass的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.4.4 中的 Spring Security 插件问题

2 Spring Security中的UserDomainClass

漫谈Spring Security 在Spring Boot 2.x endpoints中的应用

Spring-Security-OAuth2 中的 grant_type

Spring Security入门(2-2)Spring Security 的运行原理 2

使用 Spring Security 的 OAuth 2.0 中的 resourceId 是啥意思