登录认证
将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. 登录认证
- 表单发送请求
发送请求用post, 在form表单中,默认用户名和密码的name为username和password,因为shiro在取的时候就是这两个
一句话总结:如果用ajax传递表单的数据,如果不进行表单的序列化,要一个参数一个参数的写,太麻烦,序列化的话,一句代码搞定。data:$(‘form’).serialize(),这样一句话解决复杂的表单ajax的post传值过程。
- 指定登录认证路径
application-shiro.xml
<!--其他请求会判断当前有没有认证过 如果没有则跳转到login.jsp
loginUrl如果发现请求是loginUrl值会直接去做认证 没有认证的话就会去执行对应的login请求
配置登陆认证的路径-->
<!-- 配置登录认证的路径 -->
<property name="loginUrl" value="/login" />
- 创建登录realm
通过用户名查询(认证)是否存在该用户
4. 配置realm数据源
5.创建表单认证过滤器
继承该类并override这两个方法
这个写法相当于覆盖原先shiro的过滤器(重新配置过滤器)
- 登陆时的逻辑处理
登录成功即认证通过,通过最原始的response将数据传至response域
判断各种错误类型,比如密码错误,账号错误
- 注销(登出)
shiro配置文件中
登录授权
当我们在控制器方法写了 @RequiresPermissions,Shiro在访问时, 就会判断有没有该权限,如果没有,就不会执行对应方法
实现过程
- 在配置文件当中添加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>
- 在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的标签,每一个标签都要去到授权当中进行一次授权查询
授权查询只使用一次即可, 所以使用缓存,把对应的内容缓存起来,下次再去, 直接从缓存当中进行查询(对于员工列表需要判断是否有权限进行展示,对于添加,编辑,离职按钮也需要权限认证,因此需要有缓存)
使用步骤:
- 添加缓存pom依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
- 添加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>
- application-shiro中配置缓存管理器
<!-- 缓存管理器 -->
<bean id="ehCache" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml"/>
</bean>
- 把缓存管理器添加到安全管理器当中
ref就是引用上面的缓存管理器