Spring动态角色的安全端点保护

时间:2018-03-13 11:28:00

标签: spring-boot spring-security

对用户角色保护端点有疑问。我有一个端点" / 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>端点如何受到运行时创建的新角色的保护?

1 个答案:

答案 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}