【问题标题】:Role based authorizations to actions in Java/StrutsJava/Struts 中基于角色的操作授权
【发布时间】:2015-10-02 17:56:45
【问题描述】:

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

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

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

更新:

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

【问题讨论】:

  • 先发布您的代码。
  • 向我们展示一些代码以及您想到的所有想法/方式。
  • 已编辑帖子。实际上我需要一些授权方法来在我的应用程序中执行。
  • 哪个 Struts 版本?显示您的代码和配置。
  • 我的应用程序中已经有了拦截器。如何自定义它以根据操作类选择管理员/用户?

标签: java struts2 authorization struts roles


【解决方案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>

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

【讨论】:

  • 不要在 cmets 中发布代码。如果您有其他问题,请在单独的帖子中发布。
  • 抱歉发布代码。如何在 struts 中指定管理员或成员角色?我只有在 db 中有条目来指定角色或在会话中。
  • 如果有其他问题,可以在其他页面提问。
【解决方案2】:

查看此代码

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

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。否则请!将他/她重定向到登录或索引并显示一条消息。

【讨论】:

  • 谢谢。但是用户可以访问管理员中的所有链接。那么我必须在admin的每个jsp页面中添加这个'if'语句吗?
  • 将 if con 添加到每个 JSP。
  • 我不确定是否将其应用于所有页面。还有其他方法吗?我们可以从 struts 中做到这一点吗?我在 struts.xml 的一个包中拥有所有管理员操作,在另一个包中拥有用户操作。
  • 你能给我一些基于角色的拦截器的例子吗?
  • @JABBARITaoufik,不推荐。看看我上面的cmets
猜你喜欢
  • 2022-01-01
  • 2018-04-17
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2017-04-12
相关资源
最近更新 更多