这一节介绍了在 Web 项目中使用 Shiro 的步骤。
Shiro 学习笔记(7)—— Shiro 集成 Web
在 Web 环境下集成 Shiro 其实不难,按照官方文本的说明实现就可以了。更多地,我们会在 Spring 的 Web 环境中使用 Shiro ,这个我们后面再讲。
参考 Shiro 官方文档中集成 Web 的这个章节:http://shiro.apache.org/webapp-tutorial.html。
项目源码下载:https://github.com/weimingge14/Shiro-Web
步骤1:在 web.xml 部署描述符中配置 Shiro。
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
步骤2:配置 shiro.ini
默认的情况下,Shiro 使用的核心配置文件就是在 WEB-INF/classes 根路径下的 shiro.ini 。如果你使用的是 Maven 或者 Gradle 构建,可以把 shiro.ini 文件放在 resources 目录下。
下面这个配置文件,我都详细地写了每一项配置的说明。
[main]
# 身份认证不通过的用户,Shiro 会帮助跳转(Get)到一个地址
# 这个地址只能是站内的一个地址
authc.loginUrl=/login
# 在身份认证成功的前提下,用户不具有相应的角色,跳转(Get)到下面这个链接
roles.unauthorizedUrl=/unauthorized-noRole.jsp
# 在身份认证成功的前提下,用户不具有相应的权限,跳转(Get)到下面这个链接
perms.unauthorizedUrl=/unauthorized-noPermission.jsp
[users]
# 用户 liwei 具有角色 admin
liwei=123456,admin
zhouguang=666666,teacher
yuanlian=888888
lirui=999999
[roles]
# admin 角色的定义
admin=user:*
# teacher 角色的定义
teacher=student:*
[urls]
# 访问 /login 不须要身份认证
/login=anon
# 访问 /admin 须要身份认证
/admin=authc
# 访问 /student 不仅须要身份认证,而且还要具有角色 teacher
/student=roles[teacher]
# 访问 /teacher 不仅须要身份认证,而且还要具有权限 "user:create"
/teacher=perms["user:create"]
步骤3:编写登录认证的代码
以前我们写的测试代码中有一句 SecurityUtil.setSecurityManager(securityManager)
,在 Web 集成了 Shiro 以后,我们不用写这一句,就可以完成认证的操作。
以下是示例代码。
@WebServlet(name = "LoginServlet",urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("login post");
String userName =request.getParameter("userName");
String password =request.getParameter("password");
// 因为 SecurityUtil.setSecurityManager(securityManager)
// 这件事情都交给了 web.xml 配置的监听器来完成了,所以这里不用写了
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(userName,password,"xx");
try {
currentUser.login(token);
// 登录成功以后重定向跳转到 success.jsp
response.sendRedirect("success.jsp");
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("无效的用户名");
request.setAttribute("errorInfo", "用户名错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}catch (IncorrectCredentialsException e){
System.out.println("错误的密码");
request.setAttribute("errorInfo", "密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}catch (AuthenticationException e) {
e.printStackTrace();
request.setAttribute("errorInfo", "其它 AuthenticationException ");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
// 这里不能用 currentUser.logout(); 否则每次进来都要验证
// currentUser.logout();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("login get");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
其实这个时候项目的大题框架已经建好了,后面再有就是一些页面的设置,在这里就不多展示代码,占用文章篇幅了,大家可以下载我的代码,在本地跑起来自己测试一下。最最核心的是要理解 shiro.ini 这个核心配置文件每一项的意义,然后进行相应的测试。