JAVA EE @DeclareRoles
注释是一种声明用户可能的角色列表以与注释@RolesAllowed
匹配的方法。
但是,如果我们的角色存储在数据库中并且潜在角色列表很长怎么办?
我目前使用角色为网站上的功能指定一个原子访问,因此我的角色列表很长,因为某些用户可以访问功能1,但不能访问2,有些用户可以2,但不在1上,等等...
我想避免每次为新功能创建新角色时都编辑@DeclareRoles
注释,所以问题是:
是否可以通过编程方式设置@DeclareRoles批注或指定应从数据库中加载批注?
答案 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