JAAS - RoleGroup X Role Qual a diferença?

Pessoal, todo artigo que vejo sobre JAAS tem a mesma receita de bolo, uma query forçando um campo ‘ROLE’.

Minha pergunta é se faz alguma diferença para o JAAS ter a seguinte modelagem:

USUARIO - USUARIO_ROLE - ROLE - ROLE_GRUPO - GRUPO

Não achei na classe javax.servlet.http.HttpServletRequest um método que traga o grupo do usuário por exemplo.
Me parece que a lógica de utilização de grupos deve ser feita internamente na aplicação e não há nada pronto.

É isso mesmo?

Exemplo no Wildfly:

              <authentication>
                    <login-module code="Database" flag="required">
                        <module-option name="dsJndiName" value="java:/jboss/datasources/ContactCenterDS"/>
                        <module-option name="principalsQuery" value="select password from USUARIO where email=?"/>
                        <module-option name="rolesQuery" value="select papel_nome,'Roles'
						                                          from USUARIO_PAPEL as user_roles
																 inner join USUARIO as su on su.id = user_roles.USUARIO_ID
																 where su.email = ?"/>
                        <module-option name="hashAlgorithm" value="SHA-256"/>
                        <module-option name="hashEncoding" value="base64"/>
                    </login-module>
                </authentication>

Ola Clebiovieira,

eu penso que você esta confundindo autenticação com autorização de acesso, eu não diria que a query força um campo ‘Role’ mas eu diria que é necessário uma ‘Role’ para o container dar ou não acesso ao seu sistema e outras Roles para definir a autorização de acesso que seu usuário possui na aplicação, embora o JAAS seja uma API relativamente velha, que se não me engano, foi introduzido no Java na versão 1.4 e não tivemos mais atualizações desde então(não vou comentar do JASPIC(Java Authentication Service Provider Interface for Containers)) no meu ver ela ainda é muito robusta, o maior beneficio que vejo é que utilizando o módulo de login configurado no container removemos uma responsabilidade de infraestrutura que geralmente fica na aplicação para o próprio container gerenciar, o que não conseguimos com Spring(não tiro nenhum mérito do Spring pois Spring Security é muito bom). mas respondendo sua pergunta a resposta é que não faz diferença a sua modelagem desde que entregue a ‘Role’ ao container.

Não vai encontrar porque não existe tal método e pior ainda em javax.servlet pois a parte de segurança fica em java.security.*. Para a aplicação não vai importar muito o grupo que você tem, mas sim as ‘Roles’ que os grupos possuem, no JavaEE6, e me corrijam se eu estiver errado, foi adicionado algumas security annotations ex:

@PermitAll
Permite que usuários com qualquer ‘Role’ acessem um método, um EJB ou uma Servlet.

@RolesAllowed({ BusinessConstants.PODE_EXCLUIR })
Se esta anotação estiver no nível do método significa que aquele usuário que tiver o papel de poder excluir podera executar o método mas se a anotação estiver a um nível de classe significa que todos métodos EJB tem a permissão exceto se este outro método tiver outro conjunto de Roles declarado ex: @RolesAllowed({ BusinessConstants.PODE_VER, BusinessConstants.PODE_EDITAR })

caso o usário não tenha permissão de executar tal método uma exception é lançada algo como is not allowed

…outras annotations

Métodos mais comuns…

boolean isUserInRole(String role)
Retorna true ou false se o usário possui ou não a Role.

Principal getUserPrincipal()
Retorna o nome do usuário autenticado, pode ser injetado com CDI ex:

@Inject
private Principal principal;
principal.getName();

Com poucas configurações você já consegue definir permissão de acesso aos seus métodos de negócio, pode na view definir a exibição dos componentes HTML baseado nas Roles que determinado usuário possui e muitas outras abordagens, em alguns casos precisamos ter mais flexibilidade com o controle de acesso mas nada impede que utilizemos um módulo de autenticação em um projeto a parte com um SSO(Single sign-on).

abaixo alguns links que tenho em meus favoritos e que seguido recorro a eles, espero que eu tenha ajudado a esclarecer suas dúvidas, grande abraço.

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/JAASRefGuide.html

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jaas/JAASLMDevGuide.html

https://docs.oracle.com/javase/8/docs/technotes/guides/security/spec/security-specTOC.fm.html

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.1/html/Security_Guide/About_Java_Authentication_and_Authorization_Service_JAAS1.html

2 curtidas

Perfeito @aix.

Eu estou usando JAAS com Wildfly 10 e está funcionando, fiz a configuração standalone.xml como manda a documentação.

Hoje eu faço assim:

//Recupera login/email do usuario que logou no sistema pelo JAAS
Principal principal = request.getUserPrincipal();

//Recupera informações sobre o usuario do sistema no banco de dados
this.systemUser = securityDAO.getSystemUserByName(principal.getName());			

Com relação ao Group, eu realmente vi em alguns lugares sendo mencionado a palavra Group em alguns artigos,
no entanto nenhum exemplo. Creio que posso ter confundido.

Pelo visto já estou seguindo as sugestões que você deu no inicio da explicação.

Agradeço pela paciência e detalhamento da sua resposta.

Abraços !!

Sim, esta tudo certinho, é mais por convenção mesmo que o pessoal utiliza assim, mas sempre é possivel configurar a nosso gosto, abraços brother, sucesso ai no seu projeto.

1 curtida