struts2的基于拦截器的权限设计

本文详细介绍了如何在Struts框架中通过拦截器实现用户权限判断,并利用fn标签在页面上展示已授权的功能链接。具体包括权限判断流程、数据库录入授权请求、session存储授权数据及页面条件判断实现。
1、struts-config.xml中的配置

<package name="ehrDefault" extends="struts-default">
<interceptors>
<interceptor name="admin"
class="com.gd.interceptor.AdminInterceptor" />
<interceptor-stack name="requireLogin">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="admin" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="requireLogin" />
<global-results>
<result name="login" type="redirect">/index.jsp</result>
</global-results>
</package>

2、拦截类

package com.gd.interceptor;

import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.gd.po.Userinfo;
import com.gd.service.ISecurityPermissionManager;
import com.gd.service.ISecurityUserManager;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AdminInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 7426957840297915277L;
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map<String, Object> session = ai.getInvocationContext().getSession();
if (session == null) {
return Action.LOGIN;
}
Userinfo user = (Userinfo) session.get("user");
if (user == null) {
return Action.LOGIN;
}

// 用户访问Action权限判断
if (!actionAuthority(ai, session)) {
return Action.LOGIN;
}

return ai.invoke();
}
public boolean actionAuthority(ActionInvocation ai, Map<String, Object> session) {
// 用户访问Action权限判断
ServletContext sc = ServletActionContext.getServletContext();
String permission = ai.getProxy().getActionName().toLowerCase() + "." + ai.getProxy().getMethod().toLowerCase();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(sc);
ISecurityUserManager securityUserManager = (ISecurityUserManager) context.getBean("securityUserManager");
ISecurityPermissionManager securityPermissionManager = (ISecurityPermissionManager) context.getBean("securityPermissionManager");
if(!securityPermissionManager.checkIsRepeatPermission(permission)){
return true;
}
if(securityUserManager!=null){
Userinfo userInfo=(Userinfo)session.get("user");
return securityUserManager.checkPrivilege(userInfo.getUserName(),permission);
}
return true;
}
}

在以上拦截类中。系统会拦截到类似于loginAction.islogin这样的请求,在配置中我们将这样的请求手动录入数据库,然后根据当前用户查询该请求是否授权于用户(该块功能自己设计,比较简单),在用户登录时即将这样授权用户的请求数据取出放入session,在页面中用fn标签进行这样的判断:
<c:if test="${fn:containsIgnoreCase(permissions, 'classiccasesaction.list')}">
<li><a href="ClassicCasesAction!list.action" target="main">病例自学</a></li>
</c:if>

如果授权了,则该功能链接显示并能使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值