[英]Cas and Spring example: I don't understand “setUserDetailsService”
在此示例中: 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")));
这就是Spring安全性在更高层次上的工作方式。
用户尝试通过某种类型的UI(例如,CAS的一部分)进行身份验证。 用户界面将用户名/密码传递给Spring。 Spring最终将调用UserDetailService.loadUserByUsername
并将用户名传递给它,如果用户存在,则UserDetailService
将返回非null的UserDetails
。 在空的情况下UserDetails
或非空一个不同的密码,Spring将无法通过验证。
CAS只是一个身份验证服务器,它保留了用户的存储方式。 您可以选择使用LDAP或数据库。 该选择基于UserDetailService
不同实现。 再次查看javadoc 。 它具有您可以使用的默认实现的列表。
请参阅链接教程的第5部分。 它显示了如何更改CAS和Spring Boot应用程序以将数据库用作用户存储。 这里的关键是,为了使后端可以与CAS服务器一起针对存储在数据库中的用户使用,都需要进行适当的配置,以便针对数据库查找用户。 CAS是通过application.properties
配置的,而Spring是通过UserDetailService
。
现在在评论中向您的问题提问:
客户为什么要为cas服务器如何存储用户而烦恼?
客户端不应理会UserDetailService
。 它仅由CAS保护的后端服务使用。
只是为了确保我紧紧抓住它:如果我只需要知道“该用户是否已连接?” 那么CAS就足够了,我将永远不会使用UserDetailService。 但是,如果我需要有关用户的一些信息(姓名,电话等),则可以调用UserDetailService进行加载(从db,ldap或其他任何方式)。
是的,没有。 您不需要将密码存储在UserDetails
但是您需要能够为成功的CAS身份验证用户返回UserDetails
。 请参阅您的链接教程中的这一部分:
再次注意,服务器使用的数据库中的主体必须与客户端应用程序的主体相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.