2013-02-16 98 views
1

我正在开发我的第一个Jsf,Jaas,JPA,JBoss应用程序,现在我遇到了这个问题。我创建了JBoss的两个安全域:isUserInRole有时会返回false

<security-domain name="Database" cache-type="default"> 
<authentication> 
    <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> 
     <module-option name="dsJndiName" value="java:jboss/JaasDS"/> 
     <module-option name="principalsQuery" value="select password from user where mail=?"/> 
     <module-option name="rolesQuery" value="select role, 'Roles' from user u where u.mail=?"/> 
    </login-module> 
</authentication> 
</security-domain> 
<security-domain name="Custom" cache-type="default"> 
    <authentication> 
    <login-module code="demo.SampleLoginModule" flag="required"/> 
    </authentication> 
</security-domain> 

如果我使用“数据库”域一切正常,而如果我使用“自定义”域名,我不能将角色设置为本金。

我SampleLoginModule

public class SampleLoginModule implements LoginModule { 
    private String username; 
    private String password; 

    private SamplePrincipal userPrincipal; 

    public boolean login() throws LoginException { 
     //Here i check the credentials 
    } 

    public boolean commit() throws LoginException { 
     //Here i add principal to subject 

     userPrincipal.setName("username"); 

     if (!(subject.getPrincipals().contains(userPrincipal))) 
      subject.getPrincipals().add(userPrincipal); 
     } 
    } 
} 

MySimplePrincipal

public class SamplePrincipal implements Principal { 
    private String name; 

    public SamplePrincipal() { 
     super(); 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

我的方法中添加一个角色,主要因为提交否则isUserInRole返回false

我怎样才能做到这一点?

回答

1

添加包含用户的角色名的命名java.security.acl.Group角色:

Set<Principal> principals = subject.getPrincipals(); 

Group roleGroup = new JAASGroup("Roles"); 
for (String role : userRoles) 
    roleGroup.addMember(new RolePrincipal(role)); 

// group principal 
principals.add(roleGroup); 

// username principal 
principals.add(new UserPrincipal("user")); 

其中JAASGroup是java.security.acl.Group和RolePrincipal和UserPrincipal的实施是实现java.security.Principal的使用