【问题标题】:Define @DeclareRoles annotation programmatically以编程方式定义 @DeclareRoles 注释
【发布时间】:2019-07-28 11:12:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    自从引入 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

    【讨论】:

    • 我是这样理解的,但是注释@DeclareRoles 应该映射角色以在@RolesAllowed 中使用它。我可以在 @RolesAllowed 注释中使用我的用户角色而不在 @DeclareRoles 中声明/映射它吗?
    • 如果您通过getCallerGroups 返回角色 - 是的,它应该可以工作。身份存储取代了旧的做事方式。我的项目中的任何地方都没有@DeclareRoles 注释。但是,您仍然可以使用旧方法并将其与 EE8 安全性中的新功能混合使用 - 因为它完全向后兼容(或至少应该如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2013-07-23
    • 2013-06-17
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多