基于角色的授权到Java / Struts中的操作

时间:2015-07-14 07:51:52

标签: java struts2 authorization struts roles

我有一个基于Java / Struts / Hibernate的应用程序。它有2种类型的用户。管理员和普通用户。我为角色和操作创建了单独的Struts页面。

但是当我在记录为普通用户后在URL中键入admin操作时,普通用户可以访问管理页面。我该如何解决这个问题?

我已输入admin的操作类,用户在xml页面中分开,并包含在struts.xml页面中。如果你正在使用该应用程序一切正常。但考虑一下struts-admin中的一个动作,例如:adminHome,它将是localhost:8080/app/adminHome。如果普通用户登录,则URL为localhost:8080/app/normalHome。但如果普通用户类型将normalHome更改为adminHome,则可以访问管理员页面。

更新

正如我之前所说,我在struts.xml的不同包中有管理员和用户操作。我可以用Java获取其包名吗?然后,我与user_role进行比较,并指向管理员/normal页面。

2 个答案:

答案 0 :(得分:1)

请参阅此代码

在登录操作类中,在用户输入正确的详细信息后写入

session.setAttribute("user_id","userid");//store user id in session scope
session.setAttribute("user_designation","userdesignation");//store designation in session scope

以后在登录操作类中返回角色(用户名称)adminuser

return "userdesignation";//admin or user
在struts.xml中写

将conf转发到登录操作,如

<action input="/index.jsp" name="Login_Check" path="/login" scope="request" type="com.mycompany.Login_Action" validate="true">
<forward name="admin" path="adminhome.jsp"/>//if action returns `admin`
<forward name="user" path="userhome.jsp""/>//if action returns `user`
</action>

在相应的JSP中检查指定如

if (session.getAttribute("user_designation").equals("admin"))//for admin JSPs (ex: adminhome.jsp)
{
     ..............//JSP content
}
else
response.sendRedirect("some page");

if (session.getAttribute("userd_esignation").equals("user"))//for user JSPs(ex: userhome.jsp)
{
     ..............//JSP content
}
else
response.sendRedirect("some page");

如果为true,则仅显示相应的JSP。否则Plz!重定向他/她登录或索引并显示消息。

答案 1 :(得分:1)

您可以尝试使用roles拦截器来满足您的需求。

  

此拦截器确保仅在用户具有正确角色时才执行操作。

它有两个参数:

  • allowedRoles - 以逗号分隔的角色列表
  • disallowedRoles - 以逗号分隔的不允许的角色列表

您可以在操作配置中进行配置。例如

<!-- only allows the admin roles -->
<action name="adminAction" class="com.examples.AdminAction">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="roles">
      <param name="allowedRoles">admin</param>
    </interceptor-ref>
    <result>good_result.ftl</result>
</action>

<!-- only allows the member roles -->
<action name="memberAction" class="com.examples.MemberAction">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="roles">
      <param name="allowedRoles">member</param>
    </interceptor-ref>
    <result>good_result.ftl</result>
</action>

这样,您可以使用角色拦截器来限制对操作的访问。