Cas和Spring示例:我不理解“ setUserDetailsS​​ervice”

时间:2018-09-11 02:16:41

标签: spring lambda spring-security cas

在此示例中: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. 我们应该在这里放什么?我是否应该创建自己的UserDetailsS​​ervice(如果是,如何?)?我期望有一些“默认cas用户详细信息服务” ...
  2. 此代码如何工作?创建用户以提供UserDetailsS​​ervice吗?

1 个答案:

答案 0 :(得分:2)

这是Spring安全性在更高层次上的工作方式。

用户尝试通过某种类型的UI(例如,CAS的一部分)进行身份验证。用户界面将用户名/密码传递给Spring。 Spring最终将调用UserDetailService.loadUserByUsername并将其传递用户名,如果用户存在,UserDetailService将返回非null的UserDetails。如果为空UserDetails或非空值,则密码不同的Spring将会通过身份验证。

CAS只是一个身份验证服务器,它保留了用户存储方式。您可以选择使用LDAP或数据库。该选择基于UserDetailService的不同实现。再次查看javadoc。它具有您可以使用的默认实现的列表。

请参阅链接教程的第5部分。它显示了如何更改CAS和Spring Boot应用程序以将数据库用作用户存储。这里的关键是,为了使后端可以与CAS服务器一起针对存储在数据库中的用户使用,都需要进行适当的配置,以便针对数据库查找用户。通过application.properties配置CAS,并通过UserDetailService进行Spring引导。

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

  

为什么客户端应该为cas服务器如何存储用户而烦恼?

客户不应打扰UserDetailService。仅由CAS保护的后端服务使用。

  

请确保我紧紧抓住它:如果我只想知道   用户连接了吗?那么CAS就足够了,我将永远不会使用   UserDetailService。但是如果我需要有关用户的一些信息   (例如姓名,电话等),然后调用UserDetailService进行加载   (来自db,ldap或其他数据库)。

是,不是。您无需将密码存储在UserDetails中,但需要成功返回CAS身份验证的用户才能返回UserDetails。请参阅链接教程中的这一部分:

  

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