对用户角色保护端点有疑问。我有一个端点" / message"它有两种保护方式,如下所示
1)在Controller中如下
@PreAuthorize("hasAuthority('USER')")
@RequestMapping(value = "/message", method = RequestMethod.GET)
public String message() {
return "Hello World!!!"
}
2)在配置(WebSecurityConfigurereAdapter)文件中如下
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().anyRequest().authenticated()
.antMatchers(HttpMethod.GET, "/message").access("hasAuthority('USER')");
}
可以看出,USER已经在两个方面进行了硬编码,如何动态实现,一种方法是我们可以从配置文件中的数据库中读取并构建HttpSecurity,但这种情况发生在应用程序启动期间,< strong>端点如何受到运行时创建的新角色的保护?
答案 0 :(得分:-1)
保护可以随时更改的端点的最佳方式:
如果您要授予/撤消用户的角色/权限,最好的方法是使用权限而不是角色。在这种情况下,每个用户只有一个角色。每个角色可能都有一个权限列表,可以使用UI随时添加/删除角色。
怎么办?
public class Privilege{
@Id
private String id;
private String name;
//Constructors + Getters & Setters
}
public class Role{
@Id
private String id;
private String name;
private List<Privilege> privileges;
//Constructors + Getters & Setters
}
public class MyUser{
private Role role;
//All Required params
//Constructors + Getters & Setters
}
public class MyUserDetailsService implements UserDetailsService{
public User loadUserByUsername(final String userId) {
User user = //load your user
Role role = //load above user role
Collection<GrantedAuthority> grantedAuthorities.add(new SimpleGrantedAuthority(merchantRole.getName()));
for(Privilege privilege : role.getPrivileges()){
grantedAuthorities.add(new SimpleGrantedAuthority(privilege.getName()));
}
return new User(username, password, grantedAuthorities);
}
}
最后你的配置文件应如下所示:
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().anyRequest().authenticated()
.antMatchers(HttpMethod.GET, "/message").access("hasAuthority('YOUR_PRIVILAGE')");
}
注意强>
尝试创建尽可能不可分割的权限。意思是说每个特权应该特定于每个特定任务。这样,任何时候都可以使用任何权限组合创建任何角色,而无需更改antMatchers / security。
示例:
CREATE_USER_PRIVILEGE
UPDATE_USER_PRIVILEGE
DELETE_USER_PRIVILEGE
VIEW_USER_PRIVILEGE
等
ADMIN_ROLE = {CREATE_USER_PRIVILEGE, UPDATE_USER_PRIVILEGE, DELETE_USER_PRIVILEGE, VIEW_USER_PRIVILEGE}
ADMIN_ROLE = {VIEW_USER_PRIVILEGE}
等