Web 集成 Shiro 的练习项目。

Servlet + Shiro

项目结构

  • 新建Maven项目,pom配置如下

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zhen.shiro</groupId>
    <artifactId>0322ShiroWeb</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>0322ShiroWeb Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency> <!-- 添加servlet支持 -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    </dependency>
    <!-- servlet end --> <!-- jsp -->
    <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
    </dependency>
    <!-- jsp end --> <!-- 添加 jstl 支持 -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    </dependency> <!-- 添加 log4j 日志支持 -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.21</version>
    </dependency> <!-- commons-logging -->
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    </dependency> <!-- 添加 shiro 支持 -->
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.3.2</version>
    </dependency>
    <!-- 添加 shiro web 支持 -->
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.3.2</version>
    </dependency> </dependencies>
    <build>
    <finalName>0322ShiroWeb</finalName>
    </build>
    </project> 
  • 两个Servlet类
    • LoginServlet 代码如下

      package com.zhen.servlet;
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse; import org.apache.shiro.SecurityUtils;
      import org.apache.shiro.authc.UsernamePasswordToken;
      import org.apache.shiro.subject.Subject; public class LoginServlet extends HttpServlet{ /**
      *
      */
      private static final long serialVersionUID = 1L; @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      // TODO Auto-generated method stub
      System.out.println("login doGet");
      req.getRequestDispatcher("login.jsp").forward(req, resp);
      } @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("login doPost");
      String userName = req.getParameter("userName");
      String password = req.getParameter("password");
      System.out.println("login:name="+userName+" password="+password); Subject currentUser = SecurityUtils.getSubject();
      UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
      try {
      currentUser.login(token);
      resp.sendRedirect("success.jsp");
      } catch (Exception e) {
      e.printStackTrace();
      req.setAttribute("errorInfo", "用户名或者密码错误");
      req.getRequestDispatcher("login.jsp").forward(req, resp);
      } }
      }
    • AdminServlet 代码如下
      package com.zhen.servlet;
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse; public class AdminServlet extends HttpServlet{ /**
      *
      */
      private static final long serialVersionUID = 1L; @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("admin doGet");
      } @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("admin doPost");
      }
      }
  • 配置 web.xml 文件,如下
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    <display-name>0322ShiroWeb</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list> <listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener> <!-- 添加 shiro 支持 -->
    <filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    <!-- <init-param>
    <param-name>configPath</param-name>
    <param-value>/WEB-INF/shiro.ini</param-value>
    </init-param> -->
    </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> <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.zhen.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
    </servlet-mapping> <servlet>
    <servlet-name>adminServlet</servlet-name>
    <servlet-class>com.zhen.servlet.AdminServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>adminServlet</servlet-name>
    <url-pattern>/admin</url-pattern>
    </servlet-mapping> </web-app>
  • WEB-INF 下创建 shiro.ini文件,如下
    [main]
    authc.loginUrl=/login
    roles.unauthorizedUrl=/unauthorized.jsp
    perms.unauthorizedUrl=/unauthorized.jsp
    [users]
    zhen=123,admin
    jack=jack,teacher
    marry=marry
    json=json
    [roles]
    admin=user:*
    teacher=student:*
    [urls]
    /login=anon
    /admin=authc
    /admin?=authc
    /admin*=authc
    /admin/**=authc
    /student=roles[teacher]
    /teacher=perms[user:create]

项目大概就这么些东西,主要来看下 shiro.ini 文件中每行代表的意思

[main]

authc.loginUrl=/login  :身份验证的登录路径

roles.unauthorizedUrl=/unauthorized.jsp  :角色认证不通过要跳转到的路径

perms.unauthorizedUrl=/unauthorized.jsp  :权限认证不通过要跳转到的路径

[users]

zhen=123,admin   :zhen用户,密码为123,角色为admin

jack=jack,teacher :jack用户,密码为jack,角色为teacher

marry=marry    :marry用户,密码为marry

[roles]

admin=user:*    :admin角色拥有的权限为 user:*

teacher=student:* :teacher角色拥有的权限为 student:*

[urls]

/login=anon  : 表明 /login 此请求不需要进行身份认证

/admin=authc  : 表明 /admin 请求需要进行身份认证,身份认证的登录路径对应上边的 authc.loginUrl

/admin?=authc  : 表明 /admin? 请求需要进行身份认证,/admin? 可以匹配为 /admin1   /admin2,?匹配一个字符

/admin*=authc  : 表明 /admin* 请求需要进行身份认证,/admin* 可以匹配为 /admin1,/admin12,/admin, * 匹配零个、一个或多个字符

/admin/**=authc :表明 /admin/** 请求需要进行身份认证,/admin/** 可以匹配为 /admin/a , /admin/a/b, **匹配零个或多个路径

/student=roles[teacher]  : 表明 /student 请求只有角色为 teacher 的用户才能访问

/teacher=perms[user:create] : 表明 /teacher 请求只有拥有 user:create 权限的用户才能访问

url 匹配符


  • 匹配一个字符
  • *
    匹配零个、一个或多个字符
  • **
    匹配零个或多个路径

Shiro 集成 Web的更多相关文章

  1. Shiro集成web环境[Springboot]-认证与授权

    Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pag ...

  2. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  3. Shiro集成web环境[Springboot]-基础使用

    Shiro集成web环境[Springboot] 1.shiro官网查找依赖的jar,其中shiro-ehcache做授权缓存时使用,另外还需要导入ehcache的jar包 <dependenc ...

  4. Shiro集成Web

    Shiro不仅可以集成到web中,也可以集成Spring. 1.在WEB中添加Shrio支持 2.WEB中INI配置 3.JSP/GSP标签 在WEB中添加Shrio支持 如果要想在web中使用Shr ...

  5. 【Shiro】Apache Shiro架构之集成web

    Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shi ...

  6. Shiro在Web环境下集成Spring的大致工作流程

    1,Shiro提供了对Web环境的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的URL,然后进行相应的控制.      ①配置的 ShiroFilter 实现类为:org.spri ...

  7. Apache Shiro 集成-Cas

    http://blog.csdn.net/peterwanghao/article/details/8825008 Shiro集成CAS是在1.2版本里新增的功能. Shiro-cas模块将应用作为C ...

  8. cas+tomcat+shiro实现单点登录-4-Apache Shiro 集成Cas作为cas client端实现

    目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

  9. spring-boot-2.0.3应用篇 - shiro集成

    前言 上一篇:spring-boot-2.0.3源码篇 - 国际化,讲了如何实现国际化,实际上我工作用的模版引擎是freemaker,而不是thymeleaf,不过原理都是相通的. 接着上一篇,这一篇 ...

随机推荐

  1. Atitit.dart语言的特性  编译时js语言大总结

    Atitit.dart语言的特性  编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ...

  2. Django--登录认证

    COOKIE 与 SESSION 概念 cookie的使用,不止局限于我们所使用的登录认证,cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此 ...

  3. Win7 设置、访问共享文件夹

    一.设置共享文件夹 右键点击文件夹,打开“属性”窗口,选择“共享”选项卡 点击“共享”按钮,打开“文件共享”窗口,在下拉列表中选择账户,点“添加”,最后点“共享”按钮. 二.访问 \\192.168. ...

  4. left join,right join用法简介

    方法一(推荐): select a.man_id,man_name,d.sex_name,zw_name,c.money from man as a left join zw as b on a.zw ...

  5. Gradle 构建工具

    参考文章: 作者:ghui 链接:https://www.zhihu.com/question/30432152/answer/48239946 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  6. iOS拓展:react-native创建工程的坑和解决方法

    正文 首先,在创建工程之前,你需要有环境.这个网上很多,不赘述. 我们直接从创建工程开始,一步步记叙这过程. 坑一 一.打开终端,cd到你放文件的位置(我放在桌面了): yuqideMacBook-A ...

  7. PHP-Manual的学习----【语言参考】----【类型】-----【Boolean类型】

    2017年7月20日15:41:26Boolean 布尔类型 1.这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 其实就是真假的问题.2.语法 要指定一个布尔值,使用 ...

  8. Linux 随手记(文件操作)

    新建文件夹 mkdir 文件夹名 新建文件 touch 文件名 重命名 mv 文件名 新文件名 将/a目录移动到/b下,并重命名为c mv /a /b/c 复制文件 cp [选项] 源文件或目录 目标 ...

  9. lua注册函数

    #include <stdio.h> #include <math.h> #define MAX_COLOR 255 extern "C" { #inclu ...

  10. 使用onepage-scroll全屏滚动插件时的注意事项

    如果项目需要在移动端访问时需要设置responsiveFallback属性,并且在此之前还需要检测浏览器的级别(引入modernizr.js文件) var $responsiveFallback = ...