下面是详细的 "struts2如何使用拦截器进行用户权限控制实例"攻略,包含两条示例。
Struts2拦截器实现用户权限控制
在Struts2中,我们可以使用拦截器来实现用户权限控制。通过定义自定义的拦截器,在拦截器中可以获取当前用户的权限信息并进行验证,从而决定是否允许当前的请求执行。
实现步骤
以下是使用拦截器实现用户权限控制的基本步骤:
- 创建拦截器类
- 在拦截器类中实现对用户身份的认证和授权逻辑
- 在Struts2配置中声明和配置拦截器
- 在需要进行用户权限控制的Action方法上添加拦截器
示例1:基于角色的用户权限控制
假设我们要为一个网站实现以下的用户角色和系统功能授权规则:
- 包含两个用户角色:管理员和普通用户
- 管理员可以访问所有系统功能
- 普通用户只能访问部分系统功能
创建拦截器
需要创建一个名为AuthorizationInterceptor
的拦截器类,用于实现对用户的认证和授权逻辑。在这个拦截器类中,判断用户权限是否足够,如果足够则允许请求执行,否则拒绝请求并提示用户。
package com.example.interceptor;
import java.util.ArrayList;
import java.util.List;
import com.example.model.User;
import com.example.util.AuthUtil;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorizationInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
// 用户角色列表
private static final List<String> ROLES = new ArrayList<String>();
static {
ROLES.add("admin");
ROLES.add("normal");
}
// 系统功能列表
private static final List<String> ACTIONS = new ArrayList<String>();
static {
ACTIONS.add("/system/admin.do");
ACTIONS.add("/system/user.do");
ACTIONS.add("/blog/view.do");
ACTIONS.add("/blog/list.do");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取当前用户信息
User user = AuthUtil.getCurrentUser();
// 当前用户未登录
if (user == null) {
return "login";
}
// 判断当前请求是否需要用户权限验证
String actionName = invocation.getProxy().getActionName();
if (!ACTIONS.contains("/" + actionName)) {
// 不需要验证
return invocation.invoke();
}
// 判断用户角色是否足够
String role = user.getRole();
if (!ROLES.contains(role)) {
// 权限不足,拒绝请求
return "error";
}
return invocation.invoke();
}
}
声明和配置拦截器
在struts.xml
配置文件中声明拦截器,并为需要进行权限控制的Action方法声明该拦截器。以下是配置文件的示例配置:
<interceptors>
<interceptor name="authInterceptor" class="com.example.interceptor.AuthorizationInterceptor"/>
<interceptor-stack name="authStack">
<interceptor-ref name="authInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="systemAdmin" class="com.example.action.SystemAction" method="admin">
<interceptor-ref name="authStack"/>
<result name="success">/system/admin.jsp</result>
</action>
<action name="systemUser" class="com.example.action.SystemAction" method="user">
<interceptor-ref name="authStack"/>
<result name="success">/system/user.jsp</result>
</action>
<action name="blogView" class="com.example.action.BlogAction" method="view">
<interceptor-ref name="authStack"/>
<result name="success">/blog/view.jsp</result>
</action>
<action name="blogList" class="com.example.action.BlogAction" method="list">
<interceptor-ref name="authStack"/>
<result name="success">/blog/list.jsp</result>
</action>
在上面的配置中,我们声明了一个名为authInterceptor
的拦截器,该拦截器用于进行用户名和权限的验证,然后定义了一个拦截器栈authStack
,该拦截器栈将authInterceptor
和默认的拦截器栈defaultStack
组合在一起。
然后为需要进行权限控制的Action方法声明该拦截器栈即可。例如,对于SystemAction
中的admin()
方法,我们为其声明该拦截器栈,以进行权限验证。
添加权限控制拦截器
在需要进行用户权限控制的Action方法上添加刚才声明的拦截器,例如:
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
public class SystemAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String admin() {
// do something
return SUCCESS;
}
public String user() {
// do something
return SUCCESS;
}
}
在上面的代码中,我们为admin()
和user()
方法添加了authStack
拦截器栈,以对用户权限进行验证。
示例2:基于权限控制列表的用户权限控制
接下来我们看一个基于权限控制列表的示例,假设我们有一个配置文件,该文件中列出了每个用户能够访问的系统功能和相应的请求URL,配置文件如下:
[admin]
/system/admin.do
/system/user.do
/system/setting.do
/system/account.do
/blog/view.do
[normal]
/blog/view.do
针对以上的配置文件,我们需要实现如下的权限控制逻辑:
- 读取配置文件,获取每个用户的权限列表
- 在拦截器中判断当前请求的URL是否在当前用户的权限列表中
- 如果在列表中,则允许请求继续执行,否则拒绝请求
读取配置文件
在拦截器的init()
方法中,我们需要读取配置文件,获取每个用户的权限列表。以下是示例代码:
package com.example.interceptor;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.model.User;
import com.example.util.AuthUtil;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorizationInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
// 权限配置文件路径
private static final String AUTH_CONFIG_FILE = "/path/to/auth.conf";
// 用户权限列表
private static final Map<String, List<String>> AUTH_MAP = new HashMap<String, List<String>>();
static {
// 读取配置文件
try {
FileInputStream fis = new FileInputStream(AUTH_CONFIG_FILE);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line;
String currentRole = null;
List<String> currentList = null;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.startsWith("[") && line.endsWith("]")) {
// 分行读取权限配置
if (currentRole != null && currentList != null) {
AUTH_MAP.put(currentRole, currentList);
}
currentRole = line.substring(1, line.length() - 1);
currentList = new ArrayList<String>();
} else {
currentList.add(line);
}
}
// 添加最后一组权限配置
if (currentRole != null && currentList != null) {
AUTH_MAP.put(currentRole, currentList);
}
br.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void init() {
super.init();
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取当前用户信息
User user = AuthUtil.getCurrentUser();
// 当前用户未登录
if (user == null) {
return "login";
}
// 判断当前请求是否需要用户权限验证
String actionName = invocation.getProxy().getActionName(); // "/system/admin.do"
String fullName = invocation.getProxy().getNamespace().substring(1) + "/" + actionName; // "system/admin.do"
List<String> authList = AUTH_MAP.get(user.getRole());
if (authList != null && authList.contains(fullName)) {
// 用户权限验证通过,允许请求执行
return invocation.invoke();
} else {
// 用户权限验证失败,拒绝请求
return "error";
}
}
}
在Struts2配置中声明和配置拦截器
在Struts2的配置文件struts.xml
中,我们需要声明和配置刚才创建的拦截器,实现基于权限控制列表的用户权限控制。以下是示例配置:
<interceptors>
<interceptor name="authInterceptor" class="com.example.interceptor.AuthorizationInterceptor"/>
<interceptor-stack name="authStack">
<interceptor-ref name="authInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="systemAdmin" class="com.example.action.SystemAction" method="admin">
<interceptor-ref name="authStack"/>
<result name="success">/system/admin.jsp</result>
</action>
<action name="systemUser" class="com.example.action.SystemAction" method="user">
<interceptor-ref name="authStack"/>
<result name="success">/system/user.jsp</result>
</action>
<action name="blogView" class="com.example.action.BlogAction" method="view">
<interceptor-ref name="authStack"/>
<result name="success">/blog/view.jsp</result>
</action>
<action name="blogList" class="com.example.action.BlogAction" method="list">
<interceptor-ref name="authStack"/>
<result name="success">/blog/list.jsp</result>
</action>
在上面的配置中,我们声明了一个名为authInterceptor
的拦截器,该拦截器用于进行用户名和权限的验证,然后定义了一个拦截器栈authStack
,该拦截器栈将authInterceptor
和默认的拦截器栈defaultStack
组合在一起。
然后为需要进行权限控制的Action方法声明该拦截器栈即可。
添加权限控制拦截器
在需要进行用户权限控制的Action方法上添加刚才声明的拦截器,例如:
package com.example.action;
import com.opensymphony.xwork2.ActionSupport;
public class SystemAction extends ActionSupport {
private static final long serialVersionUID = 1L;
public String admin() {
// do something
return SUCCESS;
}
public String user() {
// do something
return SUCCESS;
}
}
在上面的代码中,我们为admin()
和user()
方法添加了authStack
拦截器栈,以对用户权限进行验证。
结语
总结一下,本文通过两个示例讲解了如何使用Struts2拦截器实现用户权限控制。无论是基于角色的权限控制还是基于权限控制列表的权限控制,都可以通过拦截器实现。
不过需要注意的是,在进行用户权限控制时,需要将用户身份信息存储在Session中,并在拦截器中获取并进行验证。同时,也需要注意防止拦截器造成性能问题,对拦截器进行必要的优化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2如何使用拦截器进行用户权限控制实例 - Python技术站