代码之家  ›  专栏  ›  技术社区  ›  Tyvain

CAS和Spring示例:我不理解“setUserDetailsService”

  •  0
  • Tyvain  · 技术社区  · 6 年前

    在本例中: https://www.baeldung.com/spring-security-cas-sso

    这里有一段代码:

    @Bean
    public CasAuthenticationProvider casAuthenticationProvider() {
    
        CasAuthenticationProvider provider = new CasAuthenticationProvider();
        provider.setServiceProperties(serviceProperties());
        provider.setTicketValidator(ticketValidator());
        provider.setUserDetailsService(
          s -> new User("casuser", "Mellon", true, true, true, true,
            AuthorityUtils.createAuthorityList("ROLE_ADMIN")));
        provider.setKey("CAS_PROVIDER_LOCALHOST_9000");
        return provider;
    }
    

    我不明白这一部分:

    provider.setUserDetailsService(
          s -> new User("casuser", "Mellon", true, true, true, true,
            AuthorityUtils.createAuthorityList("ROLE_ADMIN")));
    
    1. 我们应该把什么放在这里?我是否应该创建自己的用户详细信息服务(如果是,如何创建?)?我需要一些“默认的CAS用户详细信息服务”…
    2. 这个代码是如何工作的?创建用户以提供UserDetailsService?
    1 回复  |  直到 6 年前
        1
  •  2
  •   tsolakp    6 年前

    这就是Spring Security在高级别上的工作方式。

    用户试图通过某种类型的用户界面(例如,CA的一部分)进行身份验证。用户界面将用户名/密码传递给Spring。春天终将召唤 UserDetailService.loadUserByUsername 并将用户名传递给它,如果用户存在, UserDetailService 将返回非空值 UserDetails . 在空的情况下 用户详细信息 否则,具有不同密码弹簧的非空密码将无法通过身份验证。

    CA只是一个身份验证服务器,它使用户的存储方式保持开放状态。您可以选择使用LDAP或数据库。这种选择是基于 用户详细信息服务 . 看 javadoc 再一次。它有您可以使用的默认实现列表。

    请参见链接教程的第5部分。它展示了如何将CAS和Spring引导应用程序都更改为使用数据库作为用户存储。这里的关键是,为了使后端能够针对数据库中存储的用户与CAS服务器一起工作,需要对两者进行适当的配置,以便根据数据库查找用户。通过配置CAS application.properties 和弹簧靴通过 用户详细信息服务 .

    现在请回答评论中的问题:

    为什么客户机要为CAS服务器如何存储用户而烦恼?

    客户不必费心 用户详细信息服务 . 它仅由受CAS保护的后端服务使用。

    只是为了确保我把事情搞清楚:如果我只是想知道“是吗?” 用户已连接?'那么cas就足够了,我再也不用了 用户详细信息服务。但是如果我需要一些关于用户的信息 (姓名、电话等)然后我调用userdetailservice加载它。 (来自数据库、LDAP或其他)。

    是和否。您不需要将密码存储在 用户详细信息 但你必须能回来 用户详细信息 对于成功的CAS认证用户。从链接教程中查看此部分:

    再次注意服务器使用的数据库中的主体 必须与客户端应用程序相同。