过滤器

当 Shiro 被运用到 web 项目时,Shiro 会自动创建一些默认的过滤器对客户端请求进行过滤。以下是 Shiro 提供的过滤器:

过滤器简称 对应的Java类 解释
anon org.apache.shiro.web.filter.authc.AnonymousFilter 匿名访问
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter 需要认证才能访问
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 需要httpBasic认证
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 需要拥有指定权限认证
port org.apache.shiro.web.filter.authz.PortFilter 需要使用指定端口
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter 指定请求方式访问
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 需要拥有指定角色
ssl org.apache.shiro.web.filter.authz.SslFilter 需要使用https协议
user org.apache.shiro.web.filter.authc.UserFilter 需要认证或者通过我才能访问
logout org.apache.shiro.web.filter.authc.LogoutFilter 注销,可以当做固定配置
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter

举例:

案例 解释
/admin/** = anon 表示该uri可以匿名访问(不用认证,直接访问)
/admin/** = authc 表示该uri需要登录认证才能访问
/admin/** = authcBasic 表示该uri需要httpBasic认证才能访问
/admin/** = perms[user:add:*] 表示该uri需要认证用户拥有user:add:*权限才能访问
/admin/** = port[8088] 表示该uri需要使用8088端口
/admin/** = rest[user] 相当于/admin/** = perms[user:method],其中method表示get,post,delete等提交方式
/admin/** = roles[admin] 表示该uri需要认证用户拥有admin角色才能访问
/admin/** = ssl 表示该uri需要使用https协议
/admin/** = user 表示该uri需要认证或通过记住我才能访问

注意:
anon,authcBasic,auchc,user 是认证过滤器。
perms,roles,ssl,rest,port 是授权过滤器。


整合Spring案例

1)先使用maven创建项目,搭建好如下SSM开发环境

数据库

项目结构

2)添加依赖

<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artifactId>  <version>1.2.3</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.2.3</version>
</dependency>

3)新建登录界面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'login.jsp' starting page</title></head><body><form action="${pageContext.request.contextPath }/user/login"method="post"><input type="text" name="username"/><br><input type="password" name="pwd"><br><input type="submit" value="登录"></form></body>
</html>

4)编写处理登录的UserController

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public String login(String username,String pwd,HttpServletRequest req){Subject subject=SecurityUtils.getSubject();UsernamePasswordToken token=new UsernamePasswordToken(username, pwd);try{subject.login(token);}catch(AuthenticationException e){System.out.println("登录失败!!!");e.printStackTrace();}System.out.println("登录成功!!!");return "jsp/main";}
}

5)编写业务层UserService接口以及其实现类

UserService接口

public interface SysUserService {/*** @param loginName* @return*/SysUser findByLoginName(String loginName);
}

UserServiceImpl实现类

@Service
public class SysUserServiceImpl implements SysUserService{@Resourceprivate SysUserMapper sysUserMapper;@Overridepublic SysUser findByLoginName(String loginName) {return sysUserMapper.findByLoginName(loginName);}
}

6)编写逆向工程生成的SysUserMapper接口和xml映射文件中

SysUserMapper接口:

/*** @param loginName* @return*/
SysUser findByLoginName(@Param("loginName")String loginName);

SysUserMapper.xml映射文件:

<select id="findByLoginName" resultType="com.oak.shiro.pojo.SysUser">select user_id userId,login_name loginName,password from `sys_user` where login_name=#{loginName}
</select>

7)自定义realm

public class CustomRealm extends AuthorizingRealm{@Resourceprivate SysUserService sysUserService;@Resourceprivate SysRoleService sysRoleService;@Resourceprivate SysPermisService sysPermisService;//认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//token是用户输入的//1、从token中取出身份信�?String loginName=(String) token.getPrincipal();//2、从数据库查到密码,散列�?取上面测试生成的散列�?SysUser sysUser=sysUserService.findByLoginName(loginName);// 模拟从数据库获取saltString salt = "qwerty";//上边散列值和盐对应的明文�?23Session session = SecurityUtils.getSubject().getSession();session.setAttribute("sysUser",sysUser);//如果查询到则返回认证信息AuthenticationInfoSimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(loginName,sysUser.getPassword(),ByteSource.Util.bytes(salt),this.getName());return simpleAuthenticationInfo;}//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {Session session = SecurityUtils.getSubject().getSession();SysUser sysUser=(SysUser) session.getAttribute("sysUser");System.out.println("##############"+sysUser);//获取身份信息// 权限信息对象,用来存放查出的用户的所有的角色(role)及权限(permission)等SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();if(sysUser!=null){info.addRoles(getUserRoles(sysUser.getUserId()));info.addStringPermissions(getUserPermissions(sysUser.getUserId()));}return info;}//得到用户权限private Set<String> getUserPermissions(int userId) {List<SysPermis> permisList = sysPermisService.findByUserId(userId);Set<String> permiss = new HashSet<>();if (CollectionUtils.isEmpty(permisList)) {return permiss;}for (SysPermis permis : permisList) {permiss.add(permis.getPermisCode());}return permiss;}//得到用户角色集合private Set<String> getUserRoles(int userId){List<SysRole> roleList=sysRoleService.findByUserId(userId);Set<String> roles=new HashSet<String>();//如果是空就直接返回if(CollectionUtils.isEmpty(roles)){return roles;}//如果不是空就得到角色编号添加进集合中for (SysRole role : roleList) {roles.add(role.getRoleCode());}return roles;}//init-method 配置. public void setCredentialMatcher(){HashedCredentialsMatcher  credentialsMatcher = new HashedCredentialsMatcher();    credentialsMatcher.setHashAlgorithmName("MD5");//MD5算法加密credentialsMatcher.setHashIterations(1024);//1024次循环加�?     setCredentialsMatcher(credentialsMatcher);}
}

8)applicationContext-shiro.xml配置

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置 Shiro 的 SecurityManager Bean. --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><property name="realm" ref="customRealm"/></bean><!-- 配置 Bean 后置处理器: 会自动的调用和 Spring 整合后各个组件的生命周期方法. --><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/><!-- 配置 ShiroFilter bean: 该 bean 的 id 必须和 web.xml 文件中配置的 shiro filter 的 name 一致  --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 装配 securityManager --><property name="securityManager" ref="securityManager"/><!--   配置登陆页面 --><property name="loginUrl" value="/login.jsp"/><!--    登陆成功后的一面 --><property name="successUrl" value="/index.jsp"/><property name="unauthorizedUrl" value="/unauthor.jsp"/><!--   具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截.  --><property name="filterChainDefinitions"><value><!--  对静态资源设置允许匿名访问 -->/images/** = anon/js/** = anon/css/** = anon<!--  可匿名访问路径,例如:验证码、登录连接、退出连接等 -->/user/login = anon<!-- 其他路径需要认证才能访问 -->/** =authc</value></property></bean>
</beans>

6)在shiro配置文件中添加自定义realm的bean

    <!-- 配置进行授权和认证的 Realm,要新增一个java类来实现,下面会有,class=包名.类名,init-methood是初始化的方法 --><bean id="customRealm" class="shiro.CustomRealm" init-method="setCredentialMatcher"></bean>

9)web.xml配置

 <!-- shiro filter配置shiro过滤器-->
<filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><!--默认flase :false为交给spring容器管理,true交给servlet容器管理--><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

10)编写登录之后的main.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!doctype html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>后台首页</title><script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-3.2.1.min.js"></script><script type="text/javascript">$(function(){$.ajax({// 提交数据的类型 POST GETtype : "POST",// 提交的网址url : "${pageContext.request.contextPath }/menu/userMenu",//// 返回数据的格式datatype : "json",// 成功返回之后调用的函数success : function(data) {console.log(data);// $("#msg1").html(decodeURI(data));var result = eval(data);console.log(result);handleMenu(result.menuList);},});     });//打印菜单function handleMenu(menuList) {var menuUl = "";for (var i = 0; i < menuList.length; i++) {menuUl = "<li><a href=" + menuList[i].menuUrl + ">"+ menuList[i].menuText + "</a></li>";$("#menuUl").append(menuUl);}}</script>
</head>
<body><ul id="menuUl"></ul>
</body>
</html>

11)启动测试即可

Shiro(五)——Shiro整合SSM入门完整案例相关推荐

  1. Springboot 整合 SSM 入门

    Springboot 整合 SSM 入门 首先是创建一个springboot项目 然后下面是pom.xml <project xmlns="http://maven.apache.or ...

  2. Shiro入门以及Shiro与web整合

    标题Shiro入门以及Shiro与web整合 Shiro框架 - 什么是Shiro? Apache shiro是一个强大,易用的java安全框架执行身份认证,授权,密码和会话管理. Shiro框架的核 ...

  3. JavaWeb:shiro入门小案例

    学习原因:刚接触Javaweb的时候懂的很少(当然现在也不多),所以开发一个小项目都是自己从头写到尾,从登录界面一直到数据库,当时想以后开发要是都这么写那不是很枯燥?!-知道后来团队开发,接触的开发人 ...

  4. ssm框架使用resultful_SSM框架整合完整案例

    SSM框架整合 一.整合思路 二.案例实战 1. 项目前期准备 2. 整合dao层 ① mybatis全局配置文件(SqlConfig.xml) ② 配置spring.xml ③ 编写POJO类(ja ...

  5. SSM框架整合完整案例

    SSM框架整合 一.整合思路 二.案例实战 1. 项目前期准备 2. 整合dao层 ① mybatis全局配置文件(SqlConfig.xml) ② 配置spring.xml ③ 编写POJO类(ja ...

  6. springBoot中shiro与Redis整合的配置文件

                                                                 springBoot中shiro与Redis整合的配置文件 整合依赖: < ...

  7. Shiro认证--盐加密(SSM)

    目录 一.认证 导入pom依赖 配置web.xml 数据表编写好后开始逆向生成 查数据库的地方就是realm 实现自定义realm接口 创建自定义域 编写认证方法 二.盐加密 盐加密,数据库密码发展史 ...

  8. 2021年大数据Flink(三十八):​​​​​​​Table与SQL ​​​​​​案例五 FlinkSQL整合Hive

    目录 案例五 FlinkSQL整合Hive 介绍 集成Hive的基本方式 准备工作 1.添加hadoop_classpath 2.下载jar并上传至flink/lib目录 3.修改hive配置 4.启 ...

  9. Day374.shiro授权Shiro+jsp整合Springboot -Shiro

    Shiro授权 一.授权 授权,即访问控制,控制谁能访问哪些资源.主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的. 二.关键对象 授权可简单理解为who对what( ...

  10. Shiro与SpringBoot整合,实现登录拦截、用户认证、用户授权等。实战demo

    文章目录 开篇必读: 一.开发环境 二.项目搭建 三.配置 shiro 配置类 1.自定义 Realm 类. 2.创建shiro配置类. 四.创建页面.Controller. Service等. 五. ...

最新文章

  1. UE capability与 双连接相关的参数。
  2. 【ABAP】销售订单Billing Plan创建
  3. 摄影中的色温和白平衡及其二者关系的全面详解
  4. try.dot.net 的正确使用姿势
  5. 7.请解释泛型list集合的长度为什么动态的?_Java面试题集合篇一
  6. idea中java没有run_idea 右键项目没有run 运行选项
  7. ssis 计划任务_SSIS Hadoop连接管理器和相关任务
  8. 搜索引擎优化(SEO,Search Engine Optimization)如何让你的网站靠前排名
  9. 基于VLC的视频播放器
  10. 基于python的客流统计_贵阳智能车载客流(人数)统计方案
  11. debian samba出错:set_variable_helper(yes ): value is not boolean!
  12. 读书笔记:余华--《活着--这是一本书》
  13. 基于D-S证据理论的数据融合算法的研究
  14. MySQL可视化工具HeidiSQL安装与使用
  15. 结构化分析与设计方法
  16. dor服务器阵列修复,服务器raid5阵列故障排查及数据恢复方法篇
  17. Youtube 视频下载
  18. CSS 中的 background 背景属性命令大全
  19. 2021年软考科目怎么选?
  20. Ubuntu下修改字体

热门文章

  1. android studio for android learning (九) android之Adapter用法
  2. 编译原理完整学习笔记(六):语义分析和中间代码生成
  3. 任一矩阵都可表为一对称矩阵和反称矩阵之和
  4. Codeforce 1700Difficulty Graphs 20 questions
  5. Swoole MySQL 连接池的实现
  6. Vue 学习随笔四 - 路由介绍
  7. 【Ubuntu】ubuntu 16.04 设置root用户初始密码
  8. docker nginx 反向代理
  9. Linux电源管理(3)-Generic PM之reboot过程【转】
  10. 数据库日志文件(databasename_log.ldf)太大 如何清除