PDA

Ver la versión completa : Control de acceso(roles) con Struts



luis9rs
24-10-2010, 13:38
Hola, estoy realizando una aplicacion web en java, con el framework Struts, y estoy intentando usar el control de acceso que me proporciona. Quiero realizar una gestion de perfiles que ofrezca o restrinja funcionalidades dependiendo del rol del usuario autenticado.
He probado a realizarlo para el Login.Para ello sigo los siguientes pasos:

1)En el struts-config añado los roles que deberian tener acceso en el action Login:
<action input="/index.jsp"
name="LoginForm" path="/login" scope="session" roles="Administrador" validate="true" type="modelo.gestion.usuarios.LoginAction">
<forward name="OK"
path="/inicio/inicio.jsp">
</forward>
<forward name="ERROR"
path="/index.jsp">
</forward>
</action>

2)Extiendo la clase RequestProcessor sobreescribiendo ProcessRoles para realizar la validacion de que cumpla con los roles para entrar en la pagina de inicio:

public class StrutsRequestProcessor extends RequestProcessor{

protected boolean processRoles(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException,ServletException{

String roles[] = null;
roles[0]="Administrador";
if ((roles == null) || (roles.length < 1))
{
return true;
}

HttpSession ses = request.getSession();
UsuarioBean u = (UsuarioBean)ses.getAttribute("usuario");
System.out.println("El rol es: "+ u.getRol());

for (int i = 0; i < roles.length; i++) {

if (u.getRol().equals(roles[i])) {

if (log.isDebugEnabled()) {

log.debug(" User '" + request.getRemoteUser()

+ "' has role '" + roles[i] + "', granting access");

}



return (true);

}


}

3)Le digo a struts que la clase que implementa la validacion de roles es la que yo he sobreescrito:

<controller>

<set-property property="processorClass"
value="roles.StrutsRequestProcessor"/>

</controller>


Sino tengo mal entendido, estos son los pasos que hay que realizar. Sin embargo, cuando me logueo, lo haga con el rol de Administrador, o sin el rol de Administrador, me redirige a una de las paginas de error de mi proyecto, ni siquiera a la pagina de error de la accion LoginAction. Es muy raro.

Alguien sabe si hay algun paso, que no conozco y que hay que realizar?? O si hay algo mal en mi codigo?.
Necesito vuestra ayuda!!

luis9rs
28-10-2010, 19:29
Finalmente, al no saber usar el "control de acceso" del que me habian hablado,he decido usar los taglibs de Struts, que para lo que yo necesito creo que será suficiente. La mecanica sería la de guardar en sesion el rol del usuario autenticado, y mediante los taglibs de Struts(en concreto logic) muestro o no las opciones dependiendo del rol. Ej.

<logic:equal name="usuario" property="rol" value="Administrador">

//opcion de puede mostrarse al administrador

</logic:equal>

Como es logico, en la sesion guardo el objeto "usuario" completo, ademas del rol. Por tanto "usuario" seria un Bean que incluye la propiedad "rol".Cuando encuentro un usuario con la password introducida en la base de datos, tomo de la base de datos su rol, y guardo en sesion un Bean con el login y password suministrados más su rol obtenido de la base de datos.

Espero que pueda servirle a alguien ;)