shiro三连斩之概念
1, 什么是Shiro?
Shiro是一个安全框架,用于解决系统的认证和授权问题,同时提供了会话管理,数据加密,与WEB集成,缓存等机制。
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
2、传统认证与Shiro的对比。
传统的认证,在controller层,自己编写相应的业务层与doa层方法获取数据库存储的数据进行验证
shiro、需要在shiro的realm中配置好,保存真实的数据源的地址,以及验证的方式( ....)。在controller与shiro进行交互
3,Shiro的架构
Subject:主体,可以看到主体可以是任何可以与应用交互的“用户”; 这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫等;即一个抽象概念;
SecurityManager:Shiro的核心控制器,相当于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. 配置依赖
- A. <dependency>
- B. <groupId>com.github.theborakompanioni</groupId>
- C. <artifactId>thymeleaf-extras-shiro</artifactId>
- D. <version>2.0.0</version>
- E. </dependency>
- 2. 注册Bean
- A. ShiroDialect
- 3. xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"
shiro三连斩之概念的更多相关文章
- shiro三连斩之第三斩,整合 springboot
shiro爱springboot中使用 ,还有thymeleaf前端框架.主要是如何配置 pom.xml配置依赖 <?xml version="1.0" encoding=& ...
- shiro三连斩之第二斩(SSM)
在SSM框架中使用shiro.环境 使用idea工具. 最主要的大概是配置文件如何配置吧. 1配置maven依赖 <?xml version="1.0" encoding=& ...
- shiro三连斩之第一斩
通过JavaSE,创建不同的 realm ,由简单到复杂一步步的深入的理解shiro完成认证与授权内在联系 推荐从下向上一步步的测试,每一个方法都有详细的注释,说明 从哪里来-->到哪里去,理 ...
- Docker 从入门到实践(二)Docker 三个基本概念
一.Docker 的三个进本概念? 了解 Docker 的三个基本概念,就可以大致了解 Docker 的生命周期. 镜像(Image) 容器(Container) 仓库(Repository) 二.镜 ...
- JVM 内部原理(三)— 基本概念之类文件格式
JVM 内部原理(三)- 基本概念之类文件格式 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Envi ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- JavaScript高级程序设计 第三章 基本概念
ch3 基本概念 标签(空格分隔): JavaScript 语法 标识符 - 第一个字符必须是字母.下划线或美元 - 驼峰大小写格式 严格模式 ECMAScript5引入,定义了一种解析和执行模型.此 ...
- 学习 JavaScript (三)核心概念:语法、变量、数据类型
JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,这篇文章主要讲解的是前面三个,后面三个下一篇文章再讲解. 01 语法 熟悉 JavaScript 历史的人应该都知道 ...
- Apache Shiro(三)-登录认证和权限管理MD5加密
md5 加密 在前面的例子里,用户密码是明文的,这样是有巨大风险的,一旦泄露,就不好了.所以,通常都会采用非对称加密,什么是非对称呢?就是不可逆的,而 md5 就是这样一个算法.如代码所示 123 用 ...
随机推荐
- jquery which事件 语法
jquery which事件 语法 作用:which 属性指示按了哪个键或按钮.大理石平台精度等级 语法:event.whic 参数: 参数 描述 event 必需.规定要检查的事件.这个 e ...
- Editplus注册码生成代码
function generate_editplus_regcode(username) { var list = [0,49345,49537,320,49921,960,640,49729,506 ...
- 51nod 1402 最大值(贪心)
原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 思路:借鉴了这篇博文http://blog.csdn.n ...
- 【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)
题意:在Bytemountains有N座山峰,每座山峰有他的高度h_i. 有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走, 现在有Q组询问,每组询问询问从点v开始只 ...
- Jmeter(三) 从上传图片来入门Jmeter
用Jmeter上传用户头像到人人网 先用抓包工具Fiddler把上传操作的报文抓取下来 开启Jmeter,在测试计划中创建一个线程组,取名为“图片上传” 再在线程组中创建一个HTTP请求 在请求报文中 ...
- 使用Hive-JDBC遇到的一些问题解决
使用Hive-JDBC遇到的一些问题解决(转) 标签(空格分隔): Hive 1,java.lang.NoClassDefFoundError: org/apache/hive/service/cli ...
- [BZOJ3786] 星系探索(括号序列+Splay)
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 2191 Solved: 644[Submit][Status][Discuss ...
- [CSP-S模拟测试]:多维网格(组合数学+容斥)
题目传送门(内部题138) 输入格式 输入数据第一行为两个整数$d,n$. 第二行$d$个非负整数$a_1,a_2,...,a_d$. 接下来$n$行,每行$d$个整数,表示一个坏点的坐标.数 ...
- Kotlin的高阶函数和常用高阶函数
Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...
- C++入门经典-例4.1-声明、定义和使用函数
1:代码如下: // 4.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...