在此示例中: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")));
答案 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
。请参阅链接教程中的这一部分:
再次注意服务器使用的数据库中的主体 必须与客户端应用程序的相同。