如何检索具有 Spring 安全性的 CAS 服务器发送的属性和用户名

How to retrieve attributes and username sent by the CAS server with Spring Security

我有一个 spring 引导应用程序,它本质上是 MVC。此应用程序的所有页面都通过 CAS SSO 进行身份验证。 我按照 https://www.baeldung.com/spring-security-cas-sso 中的描述使用了 "spring-security-cas" 一切都按预期正常工作。但是,我有一个问题 - 即我无法检索属性 和 CAS 服务器在以下 @Bean 中发送的用户名。我需要做什么来检索所有属性 和 CAS 服务器发送的用户名?

@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;
}

首先,您需要在 CAS 服务器的 attributeRepository 部分配置 attributeRepository 源和要检索的属性,例如:

cas.authn.attributeRepository.jdbc[0].singleRow=false
cas.authn.attributeRepository.jdbc[0].sql=SELECT * FROM USERATTRS WHERE {0}
cas.authn.attributeRepository.jdbc[0].username=username
cas.authn.attributeRepository.jdbc[0].role=role 
cas.authn.attributeRepository.jdbc[0].email=email
cas.authn.attributeRepository.jdbc[0].url=jdbc:hsqldb:hsql://localhost:9001/xdb
cas.authn.attributeRepository.jdbc[0].columnMappings.attrname=attrvalue

cas.authn.attributeRepository.defaultAttributesToRelease=username,email,role

查看 CAS 博客中的 this 示例。

然后你需要在服务上实现一个 AuthenticationUserDetailsS​​ervice 来读取 CAS 认证返回的属性,比如:

@Component
public class CasUserDetailService implements AuthenticationUserDetailsService {

    @Override
    public UserDetails loadUserDetails(Authentication authentication) throws UsernameNotFoundException {
        CasAssertionAuthenticationToken casAssertionAuthenticationToken = (CasAssertionAuthenticationToken) authentication;
        AttributePrincipal principal = casAssertionAuthenticationToken.getAssertion().getPrincipal();
        Map attributes = principal.getAttributes();
        String uname = (String) attributes.get("username");
        String email = (String) attributes.get("email");
        String role = (String) attributes.get("role");
        String username = authentication.getName();
        Collection<SimpleGrantedAuthority> collection = new ArrayList<SimpleGrantedAuthority>();
        collection.add(new SimpleGrantedAuthority(role));
        return new User(username, "", collection);
    }
}

然后,将您的 authenticationProvider 调整为 provider.setAuthenticationUserDetailsService(casUserDetailService);