SSM项目6:权限系统-用shiro进行权限控制

登录认证

将login.jsp放在webapp下

1.添加pom依赖

 <dependency>
	      <groupId>commons-logging</groupId>
	      <artifactId>commons-logging</artifactId>
	      <version>1.2</version>
	    </dependency>
	    <dependency>
	      <groupId>org.slf4j</groupId>
	      <artifactId>slf4j-nop</artifactId>
	      <version>1.7.24</version>
	    </dependency>
	    <dependency>
	      <groupId>commons-collections</groupId>
	      <artifactId>commons-collections</artifactId>
	      <version>3.2.1</version>
	    </dependency>
	    <dependency>
	      <groupId>org.apache.shiro</groupId>
	      <artifactId>shiro-core</artifactId>
	      <version>1.4.0</version>
	    </dependency>
	    <dependency>
	      <groupId>org.apache.shiro</groupId>
	      <artifactId>shiro-web</artifactId>
	      <version>1.4.0</version>
	    </dependency>
	    <dependency>
	      <groupId>org.apache.shiro</groupId>
	      <artifactId>shiro-ehcache</artifactId>
	      <version>1.4.0</version>
	    </dependency>
	    <dependency>
	      <groupId>org.apache.shiro</groupId>
	      <artifactId>shiro-spring</artifactId>
	      <version>1.4.0</version>
	    </dependency>

2.登录拦截,如果没有登录,跳转到登录页面

1.在web.xml当中配置过滤器拦截所有请求,进行处理

 <!-- 拦截到所有请求,使用spring一个bean来进行处理 -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <!-- 是否filter中的init和 destroy-->
        <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>

3.在spring当中配置shiro过滤器application-shiro.xml(记得在application-context引入)和安全管理器

application-shiro.xml
 <!-- 配置shiro过滤器 -->
 
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"></property>
        <!-- 配置shiro过滤器pattern -->
        <property name="filterChainDefinitions">
            <value>
                /static/** = anon   <!--不需要登录验证-->
                /login.jsp = anon   <!--不需要登录验证-->
                /**=authc     <!--除指定请求外,其它所有的请求都需要身份验证-->
            </value>
        </property>
    </bean>
    <!-- 配置shiro安全管理器 配置后就像之前学习shiro一样的手动配置-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"></bean>

4. 登录认证

  1. 表单发送请求
    发送请求用post, 在form表单中,默认用户名和密码的name为username和password,因为shiro在取的时候就是这两个
    一句话总结:如果用ajax传递表单的数据,如果不进行表单的序列化,要一个参数一个参数的写,太麻烦,序列化的话,一句代码搞定。data:$(‘form’).serialize(),这样一句话解决复杂的表单ajax的post传值过程。
    在这里插入图片描述
  2. 指定登录认证路径
application-shiro.xml
<!--其他请求会判断当前有没有认证过  如果没有则跳转到login.jsp
  loginUrl如果发现请求是loginUrl值会直接去做认证  没有认证的话就会去执行对应的login请求
    配置登陆认证的路径-->
<!-- 配置登录认证的路径 -->
<property name="loginUrl" value="/login" />
  1. 创建登录realm
    在这里插入图片描述

通过用户名查询(认证)是否存在该用户
在这里插入图片描述
4. 配置realm数据源
在这里插入图片描述
5.创建表单认证过滤器
继承该类并override这两个方法

在这里插入图片描述

这个写法相当于覆盖原先shiro的过滤器(重新配置过滤器)
在这里插入图片描述

  1. 登陆时的逻辑处理
    登录成功即认证通过,通过最原始的response将数据传至response域
    在这里插入图片描述
    判断各种错误类型,比如密码错误,账号错误
    在这里插入图片描述
  2. 注销(登出)
    shiro配置文件中
    在这里插入图片描述

在这里插入图片描述

登录授权

当我们在控制器方法写了 @RequiresPermissions,Shiro在访问时, 就会判断有没有该权限,如果没有,就不会执行对应方法

在这里插入图片描述

实现过程

  1. 在配置文件当中添加shiro注解扫描
<!--
    配置为true即使用cglib继承的方式,
    false为jdk的接口动态代理   控制器没有实现接口
    -->
    <aop:config proxy-target-class="true" ></aop:config>
    <!-- 使用第三方去扫描shiro的注解 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor ">
        <property name="securityManager" ref="securityManager"></property>
    </bean>
  1. 在realm中添加授权信息
    在这里插入图片描述
    在这里插入图片描述

无权限结果处理

EmployeeController.java 使员工列表跳转到某一个jsp显示
在这里插入图片描述

权限按钮控制

引入Shiro的标签库

	   在common.jsp中引入即可
	   <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>

在需要权限控制的地方添加对应的shiro标签就可以控制按钮的显示与关闭
在这里插入图片描述

密码散列

在保存用户时, 给用户密码进行加密处理
在这里插入图片描述
在认证当中添加密码处理
在这里插入图片描述
添加凭证匹配器

<!-- 配置realm数据源 -->
  <bean id="employeeRealm" class="com.itlike.realm.EmployeeRealm">
       <property name="credentialsMatcher" ref="credentialsMatcher"/>
  </bean>
		
  <!-- 凭证匹配器 -->
  <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
      <!-- 散列算法 -->
      <property name="hashAlgorithmName" value="md5"/>
      <!-- 散列次数 -->
      <property name="hashIterations" value="2"></property>
  </bean>

权限缓存

进入页面时, 页面当中写了Shiro的标签,每一个标签都要去到授权当中进行一次授权查询
授权查询只使用一次即可, 所以使用缓存,把对应的内容缓存起来,下次再去, 直接从缓存当中进行查询(对于员工列表需要判断是否有权限进行展示,对于添加,编辑,离职按钮也需要权限认证,因此需要有缓存)

使用步骤:

  1. 添加缓存pom依赖
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-ehcache</artifactId>
  <version>1.2.2</version>
</dependency>
  1. 添加shiro缓存配置
    添加shiro-ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
	<defaultCache 
		maxElementsInMemory="1000" 
		maxElementsOnDisk="10000000"
		eternal="false" 
		overflowToDisk="false" 
		diskPersistent="false"
		timeToIdleSeconds="120"
		timeToLiveSeconds="120" 
		diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>
</ehcache>
  1. application-shiro中配置缓存管理器
<!-- 缓存管理器 -->
<bean id="ehCache" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
</bean>		
  1. 把缓存管理器添加到安全管理器当中
    ref就是引用上面的缓存管理器
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值