shiro
Shiro安全框架
什么是Shiro
它是一个安全框架,用于解决系统的认证和授权问题,同时提供了会话管理,数据加密机制。
传统登陆方式
Shiro登陆方式
Shiro的内部组织结构
可以用在javaEE环境。Shiro可以帮助我们完成:认证,授权,加密,会话管理,与Web集成,缓存等。
- primary Concerns 主要的功能:
- Authentication 认证
- Authorization 授权
- Session Management 会话管理
- Cryptography 加密
应用程序如何使用Shiro框架
Shiro SecurityManager:安全管理,最核心的控制器
Realm域 :程序员提供的安全数据
- 可以看出,程序员只关注两部分:
- 如何获取Subject.
- 如何定义一个符合规定的Realm域(密码比较器的定义也是程序员干的)
- Shiro使用时要配置相关过滤器(anon,authc,authcBasic,perms,port,rest,roles,ssl,user,logout)
- Shiro中有十个拦截器,但可以只配置一个代理的就行,以一当十1234567891011121314//shiro的filter必须在struts2的filter之前,否则action无法创建<filter><filter-name>shiroFilter</filter-name>//这里的名字在spring中还会用到<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
- Shiro中有十个拦截器,但可以只配置一个代理的就行,以一当十
使用
引入依赖pom.xml或jarbao
|
|
配置过滤器(上面有)
配置shiro配置文件
在applicationContext.xml中配置shiro配置文件,放在事务管理器之前配置,Spring中引入生成Shiro的动态代理,使用cglib的方式
<aop:aspectj-autoproxy proxy-target-class="true" />
同时添加专门配置shiro的配置文件
<import resource="spring/applicationContext-shiro.xml"/>
和ehcache支持
ehcache-shiro.xml
里面放(记得在pom中引入依赖):1234567891011<ehcache updateCheck="false" name="shiroCache"><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"/></ehcache>
写配置文件
- 新建一个
applicationContext-shiro.xml
Shiro的配置的文件- 里面的约束就是Spring的约束,因为Spring与Shire天生就是一对
- 具体内容
- SecurityManager配置
- 配置Realm域
- 密码比较器
- 代理如何生成? 用工厂来生成Shiro的相关过滤器
- 配置缓存:ehcache缓存
- 安全管理
|
|
自定义realm
- 在认证、授权内部实现机制中都有提到,最终处理都将交给Realm进行处理。
- 因为在Shiro中,最终是通过Realm来获取应用程序中的用户、角色及权限信息的。
- 通常情况下,在Realm中会直接从我们的数据源中获取Shiro需要的验证信息。可以说,Realm是专用于安全框架的DAO.
- 记得配置到配置文件
- 注入
userService
跟credentialsMatchar密码比较器
(父类的父类中已经有了,所以就不用再注入了)
|
|
自定义的密码比较器CustomCredentialsMatcher
- 继承
SimpleCredentialsMatcher
- 重写了密码比较的方法
- 第一个参数AuthenticationToken 代表用户在界面上输入的用户名和密码
- 第二个参数AuthenticationInfo 代表了当前这个用户在数据库中的信息,就会有加密后的密码
- 返回值:
- true证明密码比较成功了
- false证明密码比较失败,密码输入错误,程序会抛出异常12345678910public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {//1.将用户在界面输入的密码进行加密UsernamePasswordToken upToken = (UsernamePasswordToken) token;//向下转型String inputpwd = new String(upToken.getPassword());String inputpwdEncrypt = Encrypt.md5(inputpwd, upToken.getUsername());//md5hash算法进行加密//2.将用户在数据库中的密码读取出来String dbPwd = info.getCredentials().toString();//3.进行比较return super.equals(inputpwdEncrypt, dbPwd);}
自己的程序与Shiro交互
|
|
面使用shiro标签,/home/title.jsp 主菜单
当页面上出现shiro标签的时候就会去授权,然后比较集合中是否有这一项,有就显示没有就不显示12345<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%><shiro:hasPermission name="sysadmin"><span id="topmenu" onclick="toModule('sysadmin');">系统管理</span></shiro:hasPermission>
shiro的实现图解
shiro的执行流程
使用shiro实现用户登录
授权的过程
md5hash
比md5强大的加密算法md5hash:
- 破解md5:
- 破解思路,暴力破解,因为md5是一 一 对应方式,所以如果有一个大的数据字典就很容易破解
- 或者如果能够操作数据库把密码改成一个自己知道的密文即可,md5hash不知道具体加密的次数跟盐所以行不通
- md5hash算法加密:
- md5hash因为同样的明文对应不一样的密文,所以不好破解
- 因为加密的时候有三个参数:原文,盐(用什么参数加密),跟加密的次数