isUserInRole иногда возвращает false

Я разрабатываю свое первое приложение Jsf, Jaas, JPA, JBoss, и теперь у меня есть эта проблема. Я создал два домена безопасности в JBoss:

<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.

Как я могу это сделать?


person Skizzo    schedule 16.02.2013    source источник


Ответы (1)


Добавьте java.security.acl.Group с именем Roles, который содержит имена ролей вашего пользователя:

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.

person Thomas    schedule 14.04.2013