shiro框架运行流程

认证:系统提供的用于识别用户身份的功能,通常就是登录功能。----让系统知道你是谁??
授权:系统提供的为用户分配访问系统某些功能的能力。----让系统知道你能做什么??

官网:http://shiro.apache.org/

shiro运行流程

Application Code:应用程序代码,由开发人员负责开发
Subject:主体,当前用户
SecurityManager:安全管理器,由shiro框架提供,可以管理所有的主体
Realm:安全数据桥,类似于系统中的Dao,负责访问安全数据(权限、角色、用户)

shiro框架核心功能

1、认证
2、授权
3、会话管理
4、加密

shiro框架提供的权限控制方式

1、URL拦截
2、方法注解
3、页面标签
4、代码级别

涉及的jar包

拦截参数

Shiro 的默认Filter 对应的类

 

filter过滤器别名

描述

类路径

anon

匿名过滤器

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

认证后过滤器

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

perms

权限过滤器

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

 

org.apache.shiro.web.filter.authz.PortFilter

rest

 

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

noSessionCreation

 

org.apache.shiro.web.filter.session.NoSessionCreationFilter

authcBasic

 

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

roles

角色过滤器

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

安全协议过滤器

org.apache.shiro.web.filter.authz.SslFilter

user

用户过滤器

org.apache.shiro.web.filter.authc.UserFilter

logout

退出过滤器

org.apache.shiro.web.filter.authc.LogoutFilter

anon:    例如/admins/**=anon 没有参数,表示可以匿名使用。
authc:   例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数
roles:  例如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
perms:例如/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
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里的?号后面的参数。
authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证
ssl:        例如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
user:    例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查
注:anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器

/**代表所有子包都能匹配

web.xml配置

<!-- spring提供用于整合shiro的过滤器 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

使用shiro提供的方式进行认证

/*
* 用户登录的方法-shiro提供的方式
*/
public String login() {
// 从session中获取自动生成验证码
String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
// 判断输入的验证码是否为空
if (StringUtils.isNotBlank(checkcode) && checkcode.equals(key)) {
//获得一个Subject对象
Subject subject = SecurityUtils.getSubject();//用户认证状态为“未认证”
//用户名密码令牌
AuthenticationToken token =new UsernamePasswordToken(model.getUsername(),
MD5Utils.md5(model.getPassword()));//密码加密,和数据库对应
try{
subject.login(token);
//获取签名对象
User user = (User) subject.getPrincipal();
// 将对象写回浏览器的session
           ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
return HOME;
}catch (UnknownAccountException e) {//shiro框架提供的异常,通过安全管理器捕获,账号不存在异常(原因是认证方法返回的是null)
e.printStackTrace();
return LOGIN;
}catch (IncorrectCredentialsException e) {//shiro框架提供的异常,通过安全管理器捕获,密码错误异常
e.printStackTrace();
return LOGIN;
}
} else {
// 验证码错误,返回登录页面
this.addActionError(this.getText("checkcodeerror"));
return LOGIN;
}
}

自定义realm,实现认证和授权方法

/**
* 自定义realm
*/
public class BosRealm extends AuthorizingRealm {
// 注入dao
@Autowired
private IUserDao userDao;
/**
* 认证方法
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取令牌(action传过来的token),强转成UsernamePasswordToken
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
// 得到页面输入的用户名
String username = usernamePasswordToken.getUsername();
// 根据用户名到数据库中查询密码
User user = userDao.findUserByUsername(username);
if (username == null) {
return null;
}
String password = user.getPassword();
Object principal = user;// 签名对象
Object credentials = password;// 数据库中的密码
String realmName = this.getName();// 当前realm的名称
AuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);
return info;
}

JdbcRealm加盐,MD5加密(纯数字的不安全)

实现加密方式:MD5(用户名+密码)或者MD5(MD5(用户名+密码))
第六步:在自定义Realm中实现授权方法

   /**
* 授权方法
*/
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//简单授权信息对象
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermission("admin");//为当前用户授权--admin权限
info.addRole("admin");//为当前用户授予admin角色
User user = (User) principals.getPrimaryPrincipal();
//TODO 后期需要连接数据库,查询当前登录人对应的实际的权限
return info;
}

shiro权限控制注解方式
在applicationContext.xml中开启shiro注解支持

<!-- 开启shiro注解支持 -->
<!-- 自动代理 -->
<bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
<!--强制使用cglib创建action的代理,
不配置,spring默认是使用JDK代理,
默认情况下,action有接口就会使用JDK代理 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
<!-- 切面类 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>

在Action的方法上加入shiro提供的注解

/*
* 批量作废功能
*/
@RequiresPermissions(value="delete")//执行这个方法,需要有delete这个权限
public String deleteBatch() {
userService.delete(id);
return LIST;
}

修改BaseAction的构造方法(判断是JDK代理还是cglib代理)

ParameterizedType genericSuperclass =null;
Type genericSuperclass2 = this.getClass().getGenericSuperclass();
if(genericSuperclass2 instanceof ParameterizedType){
//this为JDK创建的代理对象
genericSuperclass =(ParameterizedType) this.getClass().getGenericSuperclass();
}else{
//this为cglib创建的代理对象
genericSuperclass =(ParameterizedType) this.getClass().getSuperclass().getGenericSuperclass();
}

创建权限模块数据模型(权限表、角色表、用户表、角色权限关系表、用户角色关系表)

用户和权限不直接建立关系,是为了方便后期授权

shiro权限笔记的更多相关文章

  1. Shiro学习笔记(5)——web集成

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

  2. shiro学习笔记_0600_自定义realm实现授权

    博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...

  3. Shiro权限框架简介

    http://blog.csdn.net/xiaoxian8023/article/details/17892041   Shiro权限框架简介 2014-01-05 23:51 3111人阅读 评论 ...

  4. Shiro权限管理框架(一):Shiro的基本使用

    首发地址:https://www.guitu18.com/post/2019/07/26/43.html 核心概念 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码 ...

  5. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  6. Shiro权限管理框架(三):Shiro中权限过滤器的初始化流程和实现原理

    本篇是Shiro系列第三篇,Shiro中的过滤器初始化流程和实现原理.Shiro基于URL的权限控制是通过Filter实现的,本篇从我们注入的ShiroFilterFactoryBean开始入手,翻看 ...

  7. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  8. Shiro学习笔记总结,附加" 身份认证 "源码案例(一)

    Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...

  9. SpringMVC下的Shiro权限框架的使用

    SpringMVC+Shiro权限管理 博文目录 权限的简单描述 实例表结构及内容及POJO Shiro-pom.xml Shiro-web.xml Shiro-MyShiro-权限认证,登录认证层 ...

随机推荐

  1. 自制MVC框架原理介绍

    当初用jsp开发程序时,因为很多东西写在一起混淆的,项目做大或者变更的时候就会很吃力,联动性太大,有时修改视图的东西都可能会影响业务逻辑,分层不明确. 后来听说了Struts MVC,做过几个示例,层 ...

  2. socket.io(转载)

    socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on(‘connec ...

  3. GNU--gprof使用总结

    Added macros ACE_USES_GPROF which enables users to use gprof in a multithreaded environment with ACE ...

  4. 代理模式和php实现

    代理模式(Proxy Pattern) : 给某一个对象提供一个代 理,并由代理对象控制对原对象的引用.代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式 模式动机: 在某些情 ...

  5. 怎样优化UITableView的性能

    在iOS App中,UITableView应该是使用率最高的.同一时候也是最为复杂的视图. 差点儿全部自带的应用中都能看到它的身影,可见它的重要性. 在使用UITableView时,会常常遇到性能上的 ...

  6. 点滴积累【other】---win2003 service pack2 IIS 无法复制CONVLOG.EXE CONVLOG.EX_(转载)

    在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了下资料,说是在运行-中输入”esentutl /p %windir%/security/database/seced ...

  7. atitit.http get post的原理以及框架实现java php

    atitit.http get post的原理以及框架实现java php 1. 相关的设置 1 1.1. urlencode 1 1.2. 输出流的编码 1 1.3. 图片,文件的post 1 2. ...

  8. [svc][bg]phabricator-zh_CN汉化包

    汉化phabricator审计系统 主要是用来审计一些开发bug的,客服会提交一些bug,测试也会提交一些bug给开发. https://github.com/wanthings/phabricato ...

  9. 如何将git 关联到Pycharm

    一,预置条件 1,安装pycharm 2,安装git 仓库 二,关联步骤 1,打开Pycharm  File | Settings | Version Control | Git 2,配置需要关联的 ...

  10. iOS网络访问之使用AFNetworking

    AFNetworking是IOS上常用的第三方网络访问库,我们可以在github上下载它,同时github上有它详细的使用说明,最新的AFNetworing2.0与1.0有很大的变化,这里仅对2.0常 ...