如何通过角色声明来验证用户?

时间:2010-10-27 12:49:05

标签: java authentication jsf jboss seam

如何将Seam配置为对不同的Web资源集合使用不同的安全约束?

web.xml中我添加了

等部分
<security-constraint>
    <web-resource-collection>
        <web-resource-name>AdminPages</web-resource-name>
        <url-pattern>/secure/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>admin</role-name>
</security-role>

如果我省略上面的配置(web.xml)。使用JAAS对用户进行身份验证(仅限密码)。我不想为Authenticatin编写代码,我真的只需要检查用户是否具有所需的角色(admin)。

在Seam中,这不会像预期的那样工作。我在尝试访问/secure/*

中的页面时收到HTTP-Errorcode 403

我在components.xml中配置了这在web.xml未更改时有效。

<security:identity jaas-config-name="admins" />

jboss-web.xml

<jboss-web>
    <security-domain>java:/jaas/admins</security-domain>
</jboss-web>

问题是我在哪里配置角色。

2 个答案:

答案 0 :(得分:4)

您必须在JBoss上设置新的安全域。

例如:

<policy>
    <application-policy name="testUsersRoles">
        <authentication>
            <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                          flag="required">
                <module-option name="usersProperties">usersb64.properties</module-option>
                <module-option name="hashAlgorithm">MD5</module-option>
                <module-option name="hashEncoding">base64</module-option>
                <module-option name="unauthenticatedIdentity">nobody</module-option>
            </login-module>
        </authentication>
    </application-policy>
</policy>

(在JBoss实例的conf / login-config.xml文件中)。

您可以在此处获得更多信息:Security on JBoss

更新:

关于“对不同的web资源集合使用不同的安全性约束”部分问题,您可以设置为每个要控制的资源组添加不同的“安全性约束”:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>AdminPages</web-resource-name>
        <url-pattern>/secure/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>


<security-constraint>
    <web-resource-collection>
        <web-resource-name>CommonUserPages</web-resource-name>
        <url-pattern>/common/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
        <role-name>commonUser</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>admin</role-name>
    <role-name>commonUser</role-name>
</security-role>

请注意,这两个角色将在登录时由相关的LoginModule提取。因此,当您的LoginModule对用户进行身份验证时,它会检索该用户所属的角色集。

答案 1 :(得分:1)

将自定义标识与post Authenticate方法一起使用。

<security:identity jaas-config-name="admins" class="my.Identity"/>

示例代码:

package my;

public class Identity extends org.jboss.seam.security.Identity {

    private static final long serialVersionUID = 1L;

    @Override
    protected void postAuthenticate() {
        super.postAuthenticate();
        if(isLoggedIn() && !hasRole("admin")) {
            unAuthenticate();
        }
    }
}