miracle just wanna be better

shiro

2019-09-03
miracle

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的使用步骤;

  1. 导入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>
  1. 配置文件: 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>  
  1. 创建两个类
  • 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


上一篇 ssm

下一篇 ngnix

Comments

Content