【问题标题】:How to intercept a Spring Principal?如何拦截 Spring Principal?
【发布时间】:2019-09-18 04:43:17
【问题描述】:

我正在尝试使用 Principal 来保护我们的 REST 端点,我从我们的 SSO 解决方案中获得。

但是,我希望 principal.principal.attributes["perms_claims"] 中的值可用于 Spring Security "hasAuthority()" SpEL

我想,如果我可以在 Principal 到达 Spring Controller 之前拦截它,我可以 decorate 它以便 getAuthorities() 方法也返回 principal.principal.attributes["perms_claims"] 的内容。

我猜有一种方法可以使用 Spring Interceptor... 但我并不是要拦截请求本身,而只是拦截主体。

那么,如何在 Spring Web 控制器请求之前拦截 Principal

【问题讨论】:

    标签: spring spring-security spring-security-oauth2


    【解决方案1】:

    好问题。令人高兴的是,Spring Security reference 对此进行了介绍。

    不过,简而言之,您需要创建一个 OidcUserService 委托:

    @Component
    public class MyOidcUserService implements OAuth2UserService<OidcUserRequest, OidcUser> {
    
        private final OidcUserService delegate = new OidcUserService();
    
        @Override
        public OidcUser loadUser(OidcUserRequest request) {
            OidcUser user = this.delegate.loadUser(request);
            Collection<GrantedAuthority> authorities = // map the authorities
            return new DefaultOidcUser(authorities, user.getIdToken(), user.getUserInfo());
        }
    }
    

    请注意,Spring Security 在 5.2.0.RC1 中会自动获取此 bean。如文档所述,在早期版本中,您需要将其直接连接到 DSL。

    映射权限的策略可能类似于您在 perms_claims 属性中标识的每个权限的单个 SimpleGrantedAuthority

    更新 再想一想之后,我意识到我错过了使用GrantedAuthoritiesMappera slightly simpler solution。此解决方案比第一个解决方案范围更窄:

    @Component
    public class MyGrantedAuthoritiesMapper implements GrantedAuthoritiesMapper {
        @Override
        public Collection<? extends GrantedAuthority> mapAuthorities
            (Collection<? extends GrantedAuthority> authorities) {
            // map the authorities
        }
    }
    

    【讨论】:

    • 谢谢。查看文档,如果没有您的帮助指导,我不知道我是如何识别它的。
    猜你喜欢
    • 2018-08-09
    • 2014-06-17
    • 2019-01-18
    • 1970-01-01
    • 2014-05-19
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多