Spring Security @Secured批注和用户权限 - java

这是关于Spring v.4(MVC +安全性)的。我已经实现了UserDetailsServiceImpl,其中在loadUserByUsername方法内部向用户授予了其权限。说的很简单:

public UserDetails loadUserByUsername(String username) {
    ...     
    Collection<GrantedAuthority> authorities = new ArrayList<>();

    authorities.add(new SimpleGrantedAuthority("ADMIN"));

    return new org.springframework.security.core.userdetails.User(username, password, enabled, true, true, true, authorities);
    ...
}

而且我有一个安全控制器,其中带有@Secured批注的方法批注:

@Secured("ADMIN")
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String users(Model model ...) { ... }

如您所见,在loadUserByUsername内部,我明确授予用户ADMIN角色。
但是,当我尝试访问/users时,出现Access is denied异常:

2016-04-19 10:25:16,899调试(http-nio-8080-exec-9)
[org.springframework.security.web.access.ExceptionTranslationFilter]-
访问被拒绝(用户不是匿名用户);委托给
AccessDeniedHandler
org.springframework.security.access.AccessDeniedException:访问为
被拒绝
org.springframework.security.access.vote.AbstractAccessDecisionManager.checkAllowIfAllAbstainDecisions(AbstractAccessDecisionManager.java:70)

org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:88)

org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:232)

org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:64)

org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
...

(没有@Secured注释,一切正常。)

那么,我在这里错过了什么?

参考方案

令人惊讶的是,问题出在角色名称上。由于defaultRolePrefix设置为ROLE_(请参见org.springframework.security.access.vote.RoleVoter类),因此所有角色的名称都应以ROLE_前缀开头。换句话说,当我改变了

authorities.add(new SimpleGrantedAuthority("ADMIN"));

authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));

@Secured("ADMIN")@Secured("ROLE_ADMIN")-一切都变好了。

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…

使用身份验证的REST服务的Web应用程序的登录实现 - java

也许我的问题标题不清楚,我尝试解释一下:我使用Spring MVC + Spring Security实现了经过身份验证的REST服务。我配置了摘要身份验证,因此我需要在对服务的每个请求中包括凭据。现在,我需要为该服务实现一个Web客户端。在经典的Web应用程序中,我可以实现配置FORM auhtentication的简单登录表单,但是在这种情况下,我不知道…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

在Spring Boot中如何在WebSSOProfileConsumerImpl中设置responseSkew属性值 - java

我正在尝试将SAML OKTA集成到春季启动应用程序中。我需要在Spring Boot中使用以下bean设置:谁能帮我在Spring Boot的webSSOprofileConsumer bean中设置responseSkew属性。我只需要上面在基于注解的Spring Boot注入中提到的xml配置的等效Spring注入技术。我已经通过链接了:http://…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…