Shiro 学习笔记(7)—— Shiro 集成 Web

来源:互联网 发布:上海知柚公司官网图片 编辑:程序博客网 时间:2024/05/16 15:35

这一节介绍了在 Web 项目中使用 Shiro 的步骤。

  • Shiro 学习笔记7 Shiro 集成 Web
    • 步骤1在 webxml 部署描述符中配置 Shiro
    • 步骤2配置 shiroini
      • 步骤3编写登录认证的代码

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 具有角色 adminliwei=123456,adminzhouguang=666666,teacheryuanlian=888888lirui=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 这个核心配置文件每一项的意义,然后进行相应的测试。

0 0
原创粉丝点击