1, 什么是Shiro

  Shiro是一个安全框架,用于解决系统的认证和授权问题,同时提供了会话管理,数据加密,与WEB集成,缓存等机制。

Authentication身份认证/登录,验证用户是不是拥有相应的身份;

Authorization授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

2、传统认证与Shiro的对比。

  传统的认证,在controller层,自己编写相应的业务层与doa层方法获取数据库存储的数据进行验证

  shiro、需要在shiro的realm中配置好,保存真实的数据源的地址,以及验证的方式(   ....)。在controller与shiro进行交互

3,Shiro的架构

Subject主体,可以看到主体可以是任何可以与应用交互的“用户”; 这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫等;即一个抽象概念;

SecurityManagerShiro的核心控制器,相当于SpringMVC中的DispatcherServlet;所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理。

Authenticator认证器,负责主体认证。

Authrizer授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;

Realm域,Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

SessionManager管理Session生命周期的组件;Shiro并不仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;因此Shiro抽象了一个SessionManager来管理主体与应用之间交互的数据;

 SessionDAO用来将Session保存到数据库,可以实现自己的SessionDAO,通过如JDBC写到数据库;或者把Session放到Memcached中,可以实现自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache进行缓存,以提高性能;

CacheManager缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能

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

4,Shiro与应用程序的交互过程

1)应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;

2)我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

5,shiro认证

6. Shiro授权:

授权,也叫访问控制,即在应用中控制谁能访问哪些资源

7.Shiro加密

Shior散列HashedCredentialsMatcher密码匹配器

自定义Realm中使用盐值加密

8.Web集成:

a)  Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端控制器,是安全控制的入口点,负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作

b)  org.springfraemwork.web.filter.DelegatingFilterProxy

rest例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。

port例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString

是你访问的url里的?后面的参数。

perms例子/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于

isPermitedAll()方法。

roles例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

anon例子/admins/**=anon 没有参数,表示可以匿名使用。

authc例如/admins/user/**=authc表示需要认证才能使用,没有参数

authcBasic例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

其中anon,authcBasic,auchc,user是是认证过滤器,perms,roles,ssl,rest,port授权过滤器。

9.集成spring

A,配置过滤器,在webapp.xml中

<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

B,spring配置,参照shiro第二斩

<!--shiro配置-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="loginUrl" value="login.html"></property>
<property name="securityManager" ref="securityManager"></property>
<property name="unauthorizedUrl" value="403.html"></property>
<property name="successUrl" value="index"></property>
<property name="filterChainDefinitions">
<value>
/login.html = anon
/doLogin = anon
/* = authc
</value>
</property>
</bean>

springboot配置。这个是自定义域。SSM与springboot一样的。注册的方式不同。这个要加入到securityManager中

public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private FunctionService functionService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("授权");
User user = (User)principalCollection.getPrimaryPrincipal();
//从数据中获取角色权限数据
User roleUser = userService.findUserRolePremissionsByUserCode(user.getUsercode());
List<String> premissions = new ArrayList<>();
List<String> roles = new ArrayList<>();
roles.add(roleUser.getRole().getRolename());
for(Function f :roleUser.getRole().getFunctions()){
premissions.add(f.getFunctionname());
}
// List<String> list = functionService.getFunctionNameByUserCode(user.getUsercode());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(premissions);//权限
info.addRoles(roles);//角色
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//从主体提交过来的认证信息中
String userName = (String)authenticationToken.getPrincipal();
//通过用户名到数据库中获取凭证
User user = userService.getUserByName(userName);
System.out.println(userName+"??");
if(user == null){
return null;
}
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUserpassword(),this.getName());
info.setCredentialsSalt(ByteSource.Util.bytes("hello"));
return info;
}

10.shiro标签

10.Shiro权限注解

     Shiro提供了相应的注解用于权限控制,如果使用这些注解就需要使用AOP的功能来进行判断,Shiro提供了Spring AOP集成用于权限注解的解析和验证。

  1) 在spring-mvc.xml配置文件添加Shiro Spring AOP权限注解的支持:

<aop:config proxy-target-class="true"></aop:config>
<bean class="
org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>

  2) 配置依赖:

<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.0</version>
</dependency>

  3) 当验证失败,其会抛出UnauthorizedException异常,此时可以使用Spring的ExceptionHandler(DefaultExceptionHandler)来进行拦截处理:

@ExceptionHandler({UnauthorizedException.class})
public ModelAndView processUnauthenticatedException() {
ModelAndView mv = new ModelAndView();
mv.setViewName("forward:/403.html");
return mv;
}

  4)注解

@RequiresAuthentication 表示当前Subject已经通过login进行了身份验证;即Subject. isAuthenticated()返回true。

@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)

表示当前Subject需要角色admin和user。

@RequiresPermissions (value={“user:update”, “user:delete”}, logical= Logical.OR)

表示当前Subject需要权限user:update或user:delete

SpringBoot集成Shiro

一. 配置依赖

二. Shiro配置

三. thymeleaf使用shiro

  1. 1.      配置依赖
    1. A.     <dependency>
    2. B.             <groupId>com.github.theborakompanioni</groupId>
    3. C.             <artifactId>thymeleaf-extras-shiro</artifactId>
    4. D.             <version>2.0.0</version>
    5. E.      </dependency>

 

  1. 2.      注册Bean
    1. A.     ShiroDialect
  2. 3.      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"

 

shiro三连斩之概念的更多相关文章

  1. shiro三连斩之第三斩,整合 springboot

    shiro爱springboot中使用 ,还有thymeleaf前端框架.主要是如何配置 pom.xml配置依赖 <?xml version="1.0" encoding=& ...

  2. shiro三连斩之第二斩(SSM)

    在SSM框架中使用shiro.环境 使用idea工具. 最主要的大概是配置文件如何配置吧. 1配置maven依赖 <?xml version="1.0" encoding=& ...

  3. shiro三连斩之第一斩

    通过JavaSE,创建不同的 realm ,由简单到复杂一步步的深入的理解shiro完成认证与授权内在联系 推荐从下向上一步步的测试,每一个方法都有详细的注释,说明  从哪里来-->到哪里去,理 ...

  4. Docker 从入门到实践(二)Docker 三个基本概念

    一.Docker 的三个进本概念? 了解 Docker 的三个基本概念,就可以大致了解 Docker 的生命周期. 镜像(Image) 容器(Container) 仓库(Repository) 二.镜 ...

  5. JVM 内部原理(三)— 基本概念之类文件格式

    JVM 内部原理(三)- 基本概念之类文件格式 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Envi ...

  6. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  7. JavaScript高级程序设计 第三章 基本概念

    ch3 基本概念 标签(空格分隔): JavaScript 语法 标识符 - 第一个字符必须是字母.下划线或美元 - 驼峰大小写格式 严格模式 ECMAScript5引入,定义了一种解析和执行模型.此 ...

  8. 学习 JavaScript (三)核心概念:语法、变量、数据类型

    JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,这篇文章主要讲解的是前面三个,后面三个下一篇文章再讲解. 01 语法 熟悉 JavaScript 历史的人应该都知道 ...

  9. Apache Shiro(三)-登录认证和权限管理MD5加密

    md5 加密 在前面的例子里,用户密码是明文的,这样是有巨大风险的,一旦泄露,就不好了.所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法.如代码所示 123 用 ...

随机推荐

  1. Ubuntu镜像的MD5校验

    造冰箱的大熊猫@cnblogs 2018/9/7 1.在Ubuntu终端中,按照以下格式输入命令计算镜像文件ubuntu-xxx.iso的MD5校验和. md5sum ubuntu-xxx.iso 2 ...

  2. hdu 1081 dp问题:最大子矩阵和

    题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...

  3. 在vue项目中添加一个html页面,开启本地服务器

    在vue项目里新增一个不需要登录的页面,那么我只能新增一个html页面了,不经过路由,直接在浏览器输入路径打开,那么就需要用到本地服务器, 1.vue里面的html页面最好放过在public文件夹里面 ...

  4. [jmeter] : http采样器 Parameters、Body Data使用区别

    一.使用Jmeter进行接口测试,Headers和请求参数Parameters .Body Data 的联系 1.使用Parameters时,Content-Type 不传默认值为:applicati ...

  5. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  6. ping不通服务器就邮件警告

    ping不通服务器就发一封邮件 (单台) vim /root/scipt/1.sh #!/bin/bash ping -c 4 192.168.0.116 &> /dev/null #p ...

  7. 关于MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组.在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. 例如: CREATE TABLE `employee_tbl` ( `id` ...

  8. jsvnadmin访问一直登陆 找不到用户

    报错:AH01618: user zhangsan not found: /svn/hangzhi 在svnadmin控制台上将用户分好组,不然即使有账户也登不上

  9. ANR错误分析

    链接1:https://www.cnblogs.com/xiyuan2016/p/6740623.html 链接2:https://www.jianshu.com/p/3959a601cea6

  10. 类组件(Class component)和函数式组件(Functional component)之间有何不同

    类组件不仅允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态当组件仅是接收 props,并将组件自身渲染到页面时,该组件就是一个 ‘无状态组件(sta ...