Pessoal,
Estou começando a usar Struts e surgiu uma duvida como criar um controller para verificar se o usuario tem permissão a determinada tela.
Pois sem Struts eu tenho um controller que recebe todas as requisições e vejo se o usuario tem permissão ou não a determinadas telas ai redireciono o usuario a pagina requerida…
e no Struts qual a solução?
alguem poderia postar um exemplo?
deixe o container cuidar disso pra vc, no seu web.xml habilite a segurança.
ai no struts-config.xml basta colocar as roles que possui acesso as actions. Desta forma o struts vai verificar se existe um usuario logado na aplicação com a role de “admin” …
<action path="/teste" roles="user,admin" />
Olá Ricardo,
no Struts a tag de Form é essa…e não tenho a possibilidade de colocar “roles”…
<html:form action="/cadastro">
vc tem algum exemplo do web.xml e do form que possa postar aqui?
valeu
neste exemplo eu coloquei como um caminho protegido o /scs/*, isto significa que tudo será barrado pelo container se tiver este caminho…
entao uma action definida como:
<action path="/scs/testeAction" roles="user,admin" />
será barrada pelo container… ai caso seu usuario estiver autenticado o struts deixa vc acessar a página…
para testar, caso esteja utilizando o tomcat, coloca alguns usuarios e umas roloes no arquivo do tomcat em tomcat/conf/tomcat-users.xml …
<security-constraint>
<web-resource-collection>
<web-resource-name>Web Application</web-resource-name>
<url-pattern>/scs/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Supported Realm</realm-name>
</login-config>
<security-role>
<description>
Role de usuario
</description>
<role-name>user</role-name>
</security-role>
<security-role>
<description>
An example role defined in "conf/tomcat-users.xml"
</description>
<role-name>admin</role-name>
</security-role>
eu acho que compliquei a tua vida
, deixa eu te dar outra dica:
você pode sobrescrever o RequestProcessor do Struts, que é a classe que trata todas as requisições:
[code]
package struts.security;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class RequestProcessor extends org.apache.struts.action.RequestProcessor
{
protected boolean processPreprocess(HttpServletRequest request, HttpServletResponse response)
{
HttpSession session = request.getSession(true);
String usuario = (String) session.getAttribute("user");
if (usuario != null && usuario.equals("ricardo"))
{
return true;
}
// response.sendError(
// HttpServletResponse.SC_BAD_REQUEST,
// getInternal().getMessage("notAuthorized", mapping.getPath()));
try
{
response.sendRedirect("notAuthorized.jsp");
}
catch (IOException e)
{
e.printStackTrace();
}
return false;
}
}[/code]
ai no struts-config.xml você precisa informar que agora o RequestProcessor será feito pela sua classe:
<controller nocache="true" processorClass="struts.security.RequestProcessor" />
no exemplo eu mandei redirecionar para uma página padrao caso o usuario nao esteja logado.
pronto, tudo configurado.
Agora todas as requisições vão passar por esta classe e você retorna true/false caso o usuario deva ou nao acessar a página.
No exemplo que fiz eu recuperei a HttpSession e testei para ver se existia um usuario ricardo, se for este usuario retorna true, caso contrário redireciona e retorna false.
blz ? 
valeu Ricardo…era isso que queria…!
muito grato…
não é melhor fazer um filtro para isto??
ficaria mais simples
mas eu ainda fico com habilitar a segurança no web.xml…
Como seria se eu fosse criar um filtro…?
alguem poderia dar exemplo…?
E qual é a melhor solução para verificar se o usuario tem premissão a determinada pagina?
Pessoal não sei se um filtro ficaria legal nesta situação…
pois dentro do filtro eu vejo se o usuario está na sessão e vejo se ele tem direito a pagina a ser executada…mas com o Struts ela me retorna
cadastro.jsp e logo após cadastro.do.
ai tenho que mapear no banco de dados cadastro.jsp e cadastro.do …
será que estou certo?
estou pegando a url assim:
String path=((HttpServletRequest)request).getRequestURI();