Classes, campos Constantes

Gostaria de saber qual “estrutura de dados” mais adequada para utilizar.

No meu projeto, tenho que usar pelo código, Strings do tipo ‘ROLE_USUARIO’, ‘ROLE_ADMINISTRADOR’.

Eu achei que ficaria mais “legível” se eu utilizasse algo como ‘Permissao.ADMINISTRADOR’.

Para isso, pensei em Criar uma Classe com campos static:

public final class Permissao {
	static final String ADMINISTRADOR = "ROLE_ADMNISTRADOR";
	static final String PROFESSOR = "ROLE_PROFESSOR";
	static final String USUARIO = "ROLE_USUARIO";	
}

Não sei se conseguem seguir meu raciocinio, mas esse treco não está funcionando como eu queria…

Alguem poderia me ajudar na forma de como trabalhar assim???

[quote=crebisobom]Gostaria de saber qual “estrutura de dados” mais adequada para utilizar.

No meu projeto, tenho que usar pelo código, Strings do tipo ‘ROLE_USUARIO’, ‘ROLE_ADMINISTRADOR’.

Eu achei que ficaria mais “legível” se eu utilizasse algo como ‘Permissao.ADMINISTRADOR’.

Para isso, pensei em Criar uma Classe com campos static:

public final class Permissao {
	static final String ADMINISTRADOR = "ROLE_ADMNISTRADOR";
	static final String PROFESSOR = "ROLE_PROFESSOR";
	static final String USUARIO = "ROLE_USUARIO";	
}

Não sei se conseguem seguir meu raciocinio, mas esse treco não está funcionando como eu queria…

Alguem poderia me ajudar na forma de como trabalhar assim???[/quote]

Tire o final do seu Class:

public class Permissao {
	static final String ADMINISTRADOR = "ROLE_ADMNISTRADOR";
	static final String PROFESSOR = "ROLE_PROFESSOR";
	static final String USUARIO = "ROLE_USUARIO";	
}

Procure sobre enum.

[code]public enum Permissao {
ADMINISTRADOR, PROFESSOR, USUARIO;

@Override  
public String toString() {
    return "ROLE" + name();
 }

}[/code]

E como é o acesso

String permissao = Permissao.USUARIO

neste caso, permissao terio o valor “ROLE_USUARIO”???

Vini, vi um post seu:

Nesete caso (na minha cabeça) ele me parece mais sensato no caso de constantes numéricas…Tipo se eu salvasse no banco de dados os Números, e o código java que traduziria (A interpretação se daria com o ENUM e suas constantes numéricas…

No caso, eu gostaria de saber a maneira mais adequada, em questões de legibilidade de codigo e boas praticas, enfim…

Estou usando SpringSecurity, e ele exige algo do tipo USER_“algumacoisa”, então teria que guardar esta informação no banco na forma de string…

Se puder me esclarecer isto… e obrigado até agora.

[quote=crebisobom]E como é o acesso

String permissao = Permissao.USUARIO

neste caso, permissao terio o valor “ROLE_USUARIO”???
[/quote]

Não, você vai ter uma referência a um tipo Permissao:

Permissao permissao = Permissao.USUARIO;

Quando quiser a representação em string:

String permissaoStr = Permissao.USUARIO.toString(); //ou permissao.toString()

Quando você usa um enum, você cria um tipo. É ele que você deve usar no seu código. Apenas use representações em String quando necessário (exibir, persistir, etc.).

[quote=crebisobom]
Vini, vi um post seu:

Nesete caso (na minha cabeça) ele me parece mais sensato no caso de constantes numéricas…Tipo se eu salvasse no banco de dados os Números, e o código java que traduziria (A interpretação se daria com o ENUM e suas constantes numéricas…

No caso, eu gostaria de saber a maneira mais adequada, em questões de legibilidade de codigo e boas praticas, enfim…

Estou usando SpringSecurity, e ele exige algo do tipo USER_“algumacoisa”, então teria que guardar esta informação no banco na forma de string…

Se puder me esclarecer isto… e obrigado até agora.[/quote]

Tá usando Hibernate/JPA para persistir? O padrão é persistir o ordinal do enum. O ordinal é o índice dele. No exemplo do Vini, ADMINISTRADOR tem índice 0, PROFESSOR 1 e USUARIO 2. O Hibernate mapearia isto para uma coluna de inteiros e armazenaria este valor. Na hora de recuperar ele atribuiria a Permissao de volta à entidade persistida. Uma outra opção é armazenar o nome do tipo, por exemplo, armazenar ADMINISTRADOR, PROFESSOR e USUARIO em forma de String.

Como é sua configuração do Spring Security? Onde vc precisa de uma representação em String?

No Arquivo de configuração do SpringSecurity applicationContext-security.xml

De acordo com a documentação, ele usa esse padrao, e uns codigos que eu vi na net tb…

<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
       
       
    <http security="none" pattern="/publico/**"/>
	<http security="none" pattern="/templates/**"/>
	<http security="none" pattern="/resources/**"/>
		                  
	<http>
		<intercept-url pattern="/restrito/admin/**" access="ROLE_ADMNISTRADOR"/>
		<form-login login-page="/publico/login.jsf" always-use-default-target="true"
					default-target-url="/restrito/admin/painel_de_controle.jsf"
					authentication-failure-url="/publico/login.jsf?login_error=1"/>
		<logout logout-success-url="/publico/home.jsf"/>
		<remember-me/>
	</http>	  
	
	  		
	
	<authentication-manager>
		<authentication-provider>
			<jdbc-user-service data-source-ref="webTestDataSource"
					authorities-by-username-query="SELECT u.email, p.permissao
							FROM usuario u, usuario_permissao p WHERE u.codigo = p.usuario AND u.email = ?"
					users-by-username-query="SELECT email, senha, ativo FROM usuario WHERE email = ?"/>
		</authentication-provider>
	</authentication-manager>
	     		
</b:beans>

Seria de outra forma?

Ele usa tipo uma caixa de login padrão, com os componentes input com nomes escpecificos…