我有一个基于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
页面。
答案 0 :(得分:1)
请参阅此代码
在登录操作类中,在用户输入正确的详细信息后写入
session.setAttribute("user_id","userid");//store user id in session scope
session.setAttribute("user_designation","userdesignation");//store designation in session scope
以后在登录操作类中返回角色(用户名称)admin
或user
。
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>
这样,您可以使用角色拦截器来限制对操作的访问。