Shiro

一、什么是Shiro

  Apache Shiro是Java的一个安全(权限)框架

  作用:认证、授权、加密、会话管理、与web集成、缓存等

  下载地址:http://shiro.apache.org/download.html

二、Shiro的架构

  1)subject:可以与应用交互的“用户”

  2)SecurityManager:相当于SpringMVC中的DispatcherServlet;是Spring的心脏,交互都由其控制。管理所有的subject且负责进行认证、授权、会话及缓存的管理。

  3)Authenticator:负责subject认证,是一个扩展点,可自定义实现;可以使用认证策略(Authentication Strategy)即什么情况下算用户通过了认证。

  4)Authorizer:授权器。决定是否有权限进行相应的操作。控制用户可以访问的有哪些

  5)Realm:可以有一个或者多个,可以认为是安全实体数据源,即用于获取安全实体的,可以是JDBC实现,也可以是内存实现等等,由用户提供。

  6)SessionManager:管理Session生命周期的组件。而Shiro并不仅仅可以在Webh环境,也可以用在普通的JavaSE环境

  7)CacheManager:缓存控制器,用来管理如用户、角色、权限等的缓存

  8)Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密

三、谈谈一些关键的位置

这里以结合springboot与mybatis的代码为例

        <!-- shiro与spring整合的依赖 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>${shiro.version}</version></dependency><!-- ali的数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- springboot的mybatis启动器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency></dependencies>
<!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- springboot的web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

相关依赖

package cn.zytao.taosir.user.config;import java.util.LinkedHashMap;
import java.util.Map;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Shiro的配置类* @author taosir*/
@Configuration
public class ShiroConfig {/*** 创建Realm*/@Bean(name="userRealm")public UserRealm getRealm() {return new UserRealm();}/*** 创建DefaultWebSecurityManager* @param userRealm*/@Bean(name="securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();//关联realm
        securityManager.setRealm(userRealm);return securityManager;}/*** 创建ShiroFilterFactoryBean*/@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();//设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);//添加Shiro内置过滤器/*** Shiro内置过滤器,可以实现权限相关的拦截器* 常用的过滤器:*     anon:无需认证(登录)可以访问*     authc:必须认证才可以访问*  user:如果使用rememberMe的功能可以直接访问*  perms:该资源必须得到资源权限才可以访问*  role:该资源必须得到角色权限才可以访问*/    Map<String, String> filterMap= new LinkedHashMap<String,String>();//修改拦截后跳转的请求路径shiroFilterFactoryBean.setLoginUrl("/user/badRequest");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);return shiroFilterFactoryBean;}}

package cn.zytao.taosir.user.config;import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;import cn.zytao.taosir.common.model.user.User;
import cn.zytao.taosir.user.mapper.UserMapper;/*** 自定义的Realm程序* @author taosir*/
public class UserRealm extends AuthorizingRealm{@Autowiredprivate UserMapper userMapper;/*** 执行授权逻辑*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {System.out.println("开始执行Shiro的授权方法...");return null;}/*** 执行认证逻辑*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {System.out.println("开始执行Shiro的认证方法...");        //编写Shiro判断逻辑,判断用户名和密码//判断用户名是否存在UsernamePasswordToken token=(UsernamePasswordToken)arg0;User user = userMapper.findByUsername(token.getUsername());if(user==null)return null;//判断密码是否正确return new SimpleAuthenticationInfo("",user.getPassword(),"");}}

主要就是这两个相关类的关联,代码为我的实现,注解已经说明了相关位置写什么内容

记得配上mybatis的配置

spring:datasource:url: jdbc:mysql://localhost:3306/taosir-user?useUnicode=true&characterEncoding=utf8
    username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
mybatis:type-aliases-package: cn.zytao.taosir.common.model.user

package cn.zytao.taosir.user.service.impl;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;import cn.zytao.taosir.common.exception.BadRequestException;
import cn.zytao.taosir.user.service.UserService;@Service
public class UserServiceImpl implements UserService{@Overridepublic void checkLogin(String username,String password) {/*** 使用Shiro编写认证操作*///获取SubjectSubject subject=SecurityUtils.getSubject();//封装用户数据UsernamePasswordToken token=new UsernamePasswordToken(username,password);//执行登录方法try {subject.login(token);} catch (UnknownAccountException e) {//用户名不存在throw new BadRequestException("该用户名不存在");} catch (IncorrectCredentialsException e) {//密码错误throw new BadRequestException("密码不正确");} catch (Exception e) {throw new BadRequestException("由于未知错误登录失败,请联系管理员或稍后重试");}}
}

转载于:https://www.cnblogs.com/it-taosir/p/9973237.html

Shiro:初识Shiro及简单尝试相关推荐

  1. springMVC和Shiro框架整合使用简单示例 【转】

    为什么80%的码农都做不了架构师?>>>    一.目录结构 首先是目录结构如图: 二.pom.xml文件 <project xmlns="http://maven. ...

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

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

  3. shiro框架---shiro配置介绍(一)

    接上一篇文章shiro框架-通过系统介绍shiro框架中的实现逻辑   项目已分享到GitHub上,如果需要的可以看下,springboot+shiro项目Git下载地址. shiro在springb ...

  4. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)EHCache版本

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

  5. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

  6. 什么是shiro?Shiro能干嘛?

    1, 什么是shiro Apache Shiro 是Java 的一个安全框架.Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境.Shiro ...

  7. 桌面应用程序员简单尝试Rich JavaScript Application

    虽然10年前搞过一段时间的Web应用开发,且为所在企业设计了一个基于ASP.NET WebForms(在.NET 1.1的基础上)的Web应用开发框架.但是,后来一直做的都是桌面类的应用,比如Smar ...

  8. Shiro <shiro:hasPermission >标签不生效,shiro权限不生效原因

    第一个可能配置文件:shiroConfig.java没加这个 /*** 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使 ...

  9. Android PC投屏简单尝试—最终章2

    源码地址:https://github.com/deepsadness/AppRemote 上一章中,我们简单实现了PC的投屏功能. 但是还是存在这一些缺陷. 屏幕的尺寸数据是写死的 不能通过PC来对 ...

  10. Android PC投屏简单尝试—最终章1

    回顾之前的几遍文章,我们分别通过RMTP协议和简单的Socket 发送Bitmap图片的Base64编码来完成投屏. 回想这系列文章的想法来源-Vysor,它通过 USB来进行连接的.又看到了 scr ...

最新文章

  1. linux 树莓派查看ip,树莓派 常用Linux命令
  2. 【pytorch】pytorch-yolov3拍照并保存,进行检测后遍历所有图片并显示图片
  3. python最好的教程_喜大普奔~可能是最好的Python教程
  4. ftl不存在为真_FreeMarker 处理不存在的变量
  5. feign整合sential,Feign中使用Sentinel熔断器防止服务雪崩
  6. vijos1197-费解的开关【递推,枚举,位运算】
  7. 《世界因你而不同-李开复自传》读书笔记(1/3)
  8. SEO|搜索引擎优化(如何让你的网站排名靠前)
  9. linux hal-get-property进程说明,Android HAL property_get() 函数用法
  10. Spring学习总结(24)——Spring配置文件加载路径总结
  11. jsp隐式对象_JSP隐式对象
  12. ThreadPool中变量ctl的分析
  13. 添加manifest解决IDirect3DDevice9::GetFrontBufferData抓屏返回失败
  14. 视频转换器Prism Plus for mac轻松转换视频!
  15. JAVA版本8u171与8u172的区别
  16. python批量删除txt文本前面几行和最后几行
  17. 我的世界服务器指令系统,我的世界中国版最全指令 MC指令最全合集
  18. 电脑外设(I/O)简介:键盘鼠标
  19. 图像的低频,中频,高频信息含义?
  20. 基于Python的银行信贷风险可视化与预警建模

热门文章

  1. struct (5.31)
  2. 「leetcode」57. 插入区间:【模拟插入】详细讲解!
  3. vim 的复制粘贴剪切
  4. poj 3468 A Simple Problem with Integers 线段树!!!!
  5. Acrobat Pro DC 教程,如何使用密码保护 PDF 文件?
  6. [Win/Mac]下载工具推荐及使用
  7. 如何将 Apple Watch 用作闹钟?
  8. C/C++代码虚拟化保护 在移动端的应用
  9. python3实现的rtsp客户端脚本
  10. 牛客网Java刷题知识点之为什么HashMap和HashSet区别