Jboss EAP 6.3 上 Web 应用程序的 JAAS 授权

JAAS Authorization for Web Application on Jboss EAP 6.3

目前,我正在将我的 Web 应用程序从 JBoss EAP 5.2 迁移到 EAP 6.3。 该应用程序正在使用自定义领域进行授权。但是,6.3 不再支持 Realm,人们建议使用自定义的 LoginModule。我做了一些研究,发现 LoginModule 仅用于身份验证。我对么?如果LoginModule也提供Authorization服务,怎么办?如果没有,有哪些替代方法可以进行授权?

谢谢。 大卫

您的 LoginModule 应该覆盖 org.jboss.security.auth.spi.AbstractServerLoginModule 的后代之一。如果您实施或覆盖 getRoleSets() 方法,您可以将角色添加到经过身份验证的用户以进行授权。

getRoleSets() 方法 return 是一组与分配给用户的角色集相对应的组。您应该 return 一个名为 "Roles" 的组,其中包含分配给用户的角色。例如:

@Override
protected Group[] getRoleSets() throws LoginException {
    Group group = new SimpleGroup("Roles");
    try {
        Principal p = createIdentity("ADMIN_ROLE");
        group.addMember(p);
    } catch (Exception e) {
        LOGGER.error("Failed to create principle on login", e);
    }
    return new Group[] { group };
}

然后向公开的方法添加 @RolesAllowed 注释,指定允许的角色。例如:

@RequestScoped
@DenyAll
@Path("admin")
public class AdminServices {

    @POST
    @Path("/myAdminUri")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed({ "ADMIN_ROLE" })
    public String administerMethod(@Context HttpServletRequest req, @Context HttpServletResponse resp)
            throws SomeException {
    ....

如果用户没有以所需角色登录,他们将被拒绝访问该方法。

编辑: web.xml 文件还可以在 <security-constraint> 节中列出安全限制。角色名称应与 getRoleSets() 方法分配的角色匹配。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Secure resources</web-resource-name>
        <url-pattern>/admin*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ADMIN_ROLE</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>ADMIN_ROLE</role-name>
</security-role>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>SecureRealm</realm-name>
</login-config>

Redhat site 上提供了安全参考指南(需要支持订阅)