Spring Security SAML 扩展和@PreAuthorize

Posted

技术标签:

【中文标题】Spring Security SAML 扩展和@PreAuthorize【英文标题】:Spring Security SAML Extension and @PreAuthorize 【发布时间】:2015-07-30 16:07:54 【问题描述】:

我的要求是使用基于 SAML 的 SSO。从 SAML 断言中检索用户组并保护其余 api 端点。我正在使用 Spring 安全 SAML 扩展和 Spring MVC。我采取的步骤是。

    使用 Spring SAML 扩展为 SP 配置应用程序。 [完成] 检索断言并分配角色 [完成] 创建休息端点。 [完成] 基于角色的安全休息端点和服务。 [不工作]

我已经实现了 SAMLUserDetailsS​​ervice,它返回一个具有权限的 UserDetails 对象。 'loadUserBySAML' 下面。

@Override
public Object loadUserBySAML(SAMLCredential credential) throws UsernameNotFoundException 

    final String userId = credential.getNameID().getValue();

    final String emailAddress = credential.getAttributeAsString("EmailAddress");
    final String firstName = credential.getAttributeAsString("FirstName");
    final String lastName = credential.getAttributeAsString("LastName");

    List<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(new SimpleGrantedAuthority("ROLE_STUDENT"));

    return new User(userId, emailAddress, firstName, lastName, authorities);

我已将<!-- Enable security annotations on methods --> <security:global-method-security pre-post-annotations="enabled" />添加到securityContext.xml。

在 RestController 和我正在使用 @PreAuthorize 的服务上,但这个注释似乎根本没有效果。

@PreAuthorize("hasRole('ROLE_PROGRAMLEAD')")
@RequestMapping(method = RequestMethod.GET)
public String hello() 
    return "Hello.";

有人可以帮我理解为什么 PreAuthorize 没有触发吗?我是否缺少一些配置?

【问题讨论】:

【参考方案1】:

&lt;security:global-method-security pre-post-annotations="enabled" /&gt; 需要进入其余控制器的 servlet xml,而不是安全上下文 xml。

参考: http://docs.spring.io/spring-security/site/faq/faq.html#faq-method-security-in-web-context

【讨论】:

【参考方案2】:

我遇到了同样的问题。我想使用 SAML 身份验证执行 API 授权。要使其工作,您需要使用带有注释的hasAuthority 参数而不是hasRole 参数。 以下对我有用:

@PreAuthorize(value="hasAuthority('Admin')")

【讨论】:

以上是关于Spring Security SAML 扩展和@PreAuthorize的主要内容,如果未能解决你的问题,请参考以下文章

Spring 框架 4.0 和 Spring security 3.2.4 上的 Spring Security SAML 扩展

Spring Security SAML 扩展 java.lang.AbstractMethodError

如何为密钥持有者配置文件配置 Spring Security SAML 扩展

未抛出 Spring Security SAML DisabledException

使用带有 Spring Security 的 SAML 进行单点登录 (SSO)

无法正确部署 Spring Security SAML 示例应用程序