0

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

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

我目前使用角色在我的网站上指定对功能的原子访问,所以我有一长串角色,因为有些用户可以访问功能 1 但不能访问 2,有些用户可以访问 2 但不能访问 1,等等。 ..

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

有没有办法以编程方式设置 @DeclareRoles 注释或指定它应该从数据库加载?

4

1 回答 1

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

于 2019-03-28T23:57:23.263 回答