我正在研究Spring Security,我对使用 @Secured 注释和 @RolesAllowed 注释之间的区别有以下疑问。
我知道两者都必须在方法级别使用,在我的学习资料中我发现了以下两个例子:
@RolesAllowed 注释:
import javax.annotation.security.RolesAllowed;
public class ItemManager {
@RolesAllowed("ROLE_MEMBER")
public Item findItem(long itemNumber) {
...
}
}
@Secured 注释:
import org.springframework.security.annotation.Secured;
public class ItemManager {
@Secured("ROLE_MEMBER")
public Item findItem(long itemNumber) {
...
}
}
在我看来,这两个注释的工作方式相同。有什么区别?我错过了什么?
我的另一个疑问是:究竟代表 ROLE_MEMBER 的是什么?
我认为这类似于基于角色的安全性,因此它可能意味着:仅当用户是其成员时才能访问带注释的资源(这是对的吗?)。但在何处以及如何定义用户已设置此角色(它是成员)的事实?究竟是如何运作的?
TNX
答案 0 :(得分:23)
@Secured
和@RolesAllowed
是相同的。他们在Spring中执行相同的操作。
但是
@RolesAllowed
- Java的标准注释。
Java定义了Java Specification Request,基本上改变了对Java语言,库和其他组件的请求。为了开发注释,他们提供了JSR 250. @RolesAllowed
包含在其中。 This link contains further info in JSR 250
@Secured
- Spring安全注释
ROLE_MEMBER
是设置给安全用户详细信息的角色。
从我当前的项目中参考此示例。在这里,我使用用户数据对象并将给予用户的角色映射到安全用户详细信息。
public class CustomUserDetails implements UserDetails {
...
...
...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
for (Role role : this.user.getRoles()){
grantedAuthorities.add(new SimpleGrantedAuthority(role.getRole()));
}
return grantedAuthorities;
}
}
然后使用@Secured
或@RolesAllowed
或@PreAuthorize("hasRole('ROLE_USER')")
为方法设置这些角色以进行安全审批。
通过设计,将安全性放在服务层中是件好事。因此,当我确保我的服务操作安全时,我会检查角色,而不是用户。
通过这种方式,我们可以通过称为角色的小型安全单元专注于业务逻辑和业务逻辑的安全性。
然后我将角色分配给用户。用户可以拥有多个角色。所以你必须在这里看到这种关系。用户被赋予角色。角色可以访问业务逻辑。通过角色,用户可以访问业务逻辑。这个概念称为基于角色的访问控制。
在复杂情况下,我们还可以管理分层角色。一个角色有许多其他角色。但是在UserDetails中,我们必须展平角色层次结构并提供要处理的Spring框架的角色列表。
答案 1 :(得分:12)
接受的答案完全回答了问题(heh),但我认为这是一个说明如何在Spring中启用方法级安全性的好地方。
您需要添加的唯一内容是配置类上的 @EnableGlobalMethodSecurity
注释(请参阅示例),并将以下属性设置为 true
(默认为false
)
securedEnabled
(启用Spring的Secured
注释。),jsr250Enabled
(启用JSR-250 standard java安全注释,如RolesAllowed
),prePostEnabled
(启用Spring的PreAuthorize
和PostAuthorize
注释)。注释用法示例:
@EnableGlobalMethodSecurity(
securedEnabled = true,
jsr250Enabled = true,
prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.formLogin(); // You probably need more than this
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
// your authentication manager config here
}
有关更详细的示例,请参阅Spring Security Method Level Annotations Example。