由于引入了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