shiro安全框架:
类似的产品:spring security, 学习成本过高,过于复杂,控制粒度细
shiro框架相对简单,足够应用在企业级项目中
springmvc中的拦截器,也可以做到安全管理,比shiro还简单
shiro安全框架能做什么:
主要的功能:
登录认证:shiro 登入
通过shiro做登录操作,如果没有登录成功,就跳转到登录页面
如果登录成功了,就跳转到指定的页面,而且还可以访问项目中,其他的敏感资源(项目中的所有的功能都能访问),就是用户访问项目中的任何资源都要通过shiro检测是否登录
权限认证:
根据用户权限的不同,登录完后显示的主页菜单中菜单项也不同
比如:
超级管理员权限的账号,能够在主页面中显示所有的菜单项(10个)
普通权限的账号,指定显示3个菜单项
shiro的全模块功能:
primary concerns:
- Authentication:登录认证
- AUthorization:授权认证
- Session Management:session管理 可以用此session共享数据 shiro登出
- Cryptography:加密管理
spportting features:支持的特性
- web support:shiro支持web项目
- caching:使用shiro的缓存机制,缓存数据
- Concurrency:支持高并发
- testing:支持测试
- run as :支持java项目
- remember me:支持记住我
其实shiro的底层用的是动态代理:
shiro的使用步骤;
- 导入jar包
<!-- Apache Shiro 权限依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.3</version>
</dependency>
<!-- spring aop 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
- 配置文件: web.xml中添加shiro的入口
<!-- shiro的过滤器 注意此处的filtername跟spring配置文件中的bean id名称一致 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- 将shiro的声明周期交给web容器管理 -->
<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>
spring_shiro.xml,用spring管理shiro的对象
<!--将Shiro的组件以bean的形式交给Spring管理 -->
<bean id="lifeCycleBeanProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
<!--Spring为shiro的bean创建代理对象
代理的方式:
1.jdk
2.cglib
-->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifeCycleBeanProcessor">
<!--表示强制使用cglib为其创建代理对象 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
<!--切面中需要的对象,也使用cglib来创建代理对象 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<!--Shiro的安全中心 其中需要提供真实的用户信息. 需要加载realm -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="AuthRealm"></property>
</bean>
<!--自定义Realm 为安全中心提供信息 -->
<bean id="AuthRealm" class="com.tarena.shiro.AuthRealm">
<property name="credentialsMatcher" ref="authCredential"></property>
</bean>
<!--自定义加密算法 -->
<bean id="authCredential" class="com.tarena.shiro.AuthCredential"/>
<!--权限认证的适配器 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"></property>
</bean>
<!-- shiro的过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--配置安全中心 -->
<property name="securityManager" ref="securityManager"></property>
<!--指定登陆的地址 当用户没有登陆时.默认跳转该页面-->
<property name="loginUrl" value="/login.html"></property>
<!--过滤器链 -->
<property name="filterChainDefinitions">
<value>
<!--添加过滤信息
1.anon 表示放行
2.authc 表示拦截-->
/user/login = anon
/css/** = anon
/font-awesome/** = anon
/fonts/** = anon
/head/** = anon
/images/** = anon
/js/** = anon
/page/** = anon
<!--/** 拦截所有的请求和静态资源文件 -->
/index.html* = authc
/index.jsp* = authc
/** = authc
</value>
</property>
</bean>
- 创建两个类
- a.此类继承自AuthoriaingRealm类
重写两个方法
登录认证
权限认证 - b.此类继承自SimpleCredentialsMatcher类 重写一个方法,指定密码的加密原则
分析用shiro登录和不用shiro登录的区别
不用shiro:
select user_id from t_user
where user_loginname=? and user_password=?
优点:访问数据库一次,能完成登录业务
缺点:不能防护除登录外的其他的敏感资源,要想防护,必须借助spirng mvc拦截器
用shiro:
select user_id id,
user_loginname loginName,
user_password password
from t_user
where user_loginname=?
优点:访问数据库一次,能够完成登录,可以防护敏感资源
缺点:性能堪忧,因为每一次url请求资源,都要经过shiro的安全管理来判断是否是登录用户2q2wa