以编程方式定义@DeclareRoles批注

时间:2019-03-06 17:31:07

标签: rest security java-ee java-ee-8

JAVA EE @DeclareRoles注释是一种声明用户可能的角色列表以与注释@RolesAllowed匹配的方法。

但是,如果我们的角色存储在数据库中并且潜在角色列表很长怎么办?

我目前使用角色为网站上的功能指定一个原子访问,因此我的角色列表很长,因为某些用户可以访问功能1,但不能访问2,有些用户可以2,但不在1上,等等...

我想避免每次为新功能创建新角色时都编辑@DeclareRoles注释,所以问题是:

是否可以通过编程方式设置@DeclareRoles批注或指定应从数据库中加载批注?

1 个答案:

答案 0 :(得分:0)

自从引入 JavaEE 8安全API 以来,您就可以编写自己的身份存储。这使您可以从自定义位置和自定义服务中获取用户和用户数据。您问过有关使用数据库的问题-这是一个使用数据库外观和自定义标识存储的示例;

@ApplicationScoped
public class MyIdentityStore implements IdentityStore {
    @EJB private UserFacade userFacade;

    @Override
    public int priority() {
        return 50;
    }

    @Override
    public Set<ValidationType> validationTypes() {
        return EnumSet.of(ValidationType.PROVIDE_GROUPS, ValidationType.VALIDATE);
    }

    @Override
    public Set<String> getCallerGroups(CredentialValidationResult validationResult) {
        final String userName = validationResult.getCallerPrincipal().getName();
        final User user= usersFacade.find(userName);
        return user.getRoles();
    }

    public CredentialValidationResult validate(UsernamePasswordCredential credential) {
        /* Handle validation/login of the user here */
    }
}

要稍微解释一下上面的内容-getCallerGroups()将返回用户所属的角色-然后您可以在整个JavaEE安全API和锁定方法(例如@RolesAllowed)中使用这些内容。当容器请求检查时,validate()方法处理用户的验证。最后,validationTypes()方法仅指定此身份存储的用途-在这种情况下,我们同时指定了角色的获取和验证的处理。

因此,自EE8引入此功能以来-它已经变得非常灵活且易于利用平台中的安全功能。

以下是有关该主题的一些非常好的参考; ​​

https://www.ibm.com/developerworks/library/j-javaee8-security-api-1

https://www.ibm.com/developerworks/library/j-javaee8-security-api-2

https://www.ibm.com/developerworks/library/j-javaee8-security-api-3

https://www.baeldung.com/java-ee-8-security