Bom, vamos lá.
Vou partir do pressuposto que vc já está na metade do caminho, como eu estava. Só não sabia como fazer dinamicamente as autorizações, pegando as permissões do BD ok? Se eu estiver errado, me corrija e tentamos resolver seu problema aqui.
Eu fazia tudo certo, mas nao sabia como tirar lá as tag <http><intercept-url> do application-context.xml.
Vou explicar mais ou menos como isso funciona. O UserDetailsImpl.java, é o coração do lance. Ele é colocado na sessão pelo Spring e nele vc terá que implementar o método public Collection<GrantedAuthority> getAuthorities() . Aí que está o segredo do negócio. No meu caso eu tenho Usuarios que tem Papeis (Admin, professor, operador, etc). Tem tbm a tabela Permissoes que é um fk de Papeis e um outro de Funcionalides (que são as urls. Ex: xx/adafsd/xxx.jsf). Lembrando que na tabela Funcionalidade eu tenho uma coluna chamada menu = 0 ou 1. Se for 1, vou usar essa fucionalidade pra montar meu menu dinamicamente, que posso explicar como faço em outro capitulo
.
Bom, vc criando uma lista de GrantedAuthority e retornando no metodo citado acima, vc já tems os papeis daquele cara na sessão. Agora, resta vc implementar o método public List<ConfigAttribute> getAttributes(Object object) { do seu FilterInvocationSecurityMetadataSource e tudo ficará bem. Esse metodo tbm retorna Papeis, tipo. Toda vez que vc clica numa url, esse método é chamado para verificar o papel que a aquela funcionalidade permite. Assim, se esse papel retornado estiver no seu UserDetailsImpl.java, vc automaticamente acessará, do contrário, será barrado.
Vou explanar um pouco meus dois metodos. No decorrer, sei que vao surgir muitas duvidas como eu mesmo tive, mas estaria aqui à disposição:
UserDetailsImpl.getAuthorities()
List<PapelVO> listPapeis = new ArrayList<PapelVO>();
if (usuarioVO.getPapeis().length > 0) {
listPapeis.addAll(Arrays.asList(usuarioVO.getPapeis()));
}
for (Iterator<PermissaoVO> iterator = permissoes.iterator(); iterator
.hasNext();) {
PermissaoVO permissao = (PermissaoVO) iterator.next();
List<Role> roles = new ArrayList<Role>();
String[] arrayPapeis = permissao.getPapeis();
for (int i = 0; i < arrayPapeis.length; i++) {
Role role = new Role(
"ROLE_" + arrayPapeis[i].toUpperCase(),
arrayPapeis[i]);
roles.add(role);
}
SecureResource secObject = new SecureResource(
permissao.getObjeto(),
SecurityConstants.RESOURCE_TYPE_FI);
String url = new String(permissao.getObjeto());
int firstQuestionMarkIndex = url.indexOf("?");
if (firstQuestionMarkIndex != -1) {
url = url.substring(0, firstQuestionMarkIndex);
}
return this.authorities;
Olha, no Filtro, vc faz do teu jeito, pegando as urls do seu banco e verificando se essa url tem Permissao, ou seja se tem num hash que vc coloca la no UserDetailsImpl. Se sim, vc vai contatenando num Stringbuffer assim “ROLE_X, ROLE_Y” e retorna da seguinta forma: return SecurityConfig.createListFromCommaDelimitedString(Seu String), caso nao encontre no HashMap do UserDetailsImpl, retorno return SecurityConfig.createListFromCommaDelimitedString(“ROLE_INVALIDA”). Ele vai barrar o usuário com isso.
Bom, tem muito coisa a ser feita ainda, tipo as Urls padroes, que sáo os js, as urls do framework que vc usa, etc. mas Se vc conseguir barrar dessa forma, já é um bom começo e eu estou aqui pra te ajudar. Qualquer coisa posta.
Abraços.