shiro配置
第一步:
先在pom。xml文件中引入Shiro的依赖
<!--shiro和spring整合-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--shiro核心包-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.3.2</version>
</dependency>
验证登录
第二步:配置过滤器工厂
首先在resources下创建 applicationContext-shiro.xml
文件 整合Shiro与Spring
<!-- 1. 配置shiro过滤器工厂 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="filterChainDefinitions">
<value>
/css/**=anon
/img/**=anon
/make/**=anon
/plugins/**=anon
/login*=anon
/index.jsp*=anon
/**=authc
</value>
</property>
</bean>
<!-- anon代表不认证也可以访问(匿名访问),authc代表必须通过认证才可以访问! -->
第三步 配置安全管理器
<!--2. 配置安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 引用自定义的realm -->
<property name="realm" ref="authRealm"/>
</bean>
里面有realm属性 ,配置realm属性 就是指定Realm域,第四步就是配置Realm域
第四步
第一点:
先创建一个类继承 AuthorizingRealm
这个类 实现类的doGetAuthorizationInfo
方法(授权访问)和doGetAuthenticationInfo
方法(登录认证)
<!--3. 配置自定义Realm域 -->
<bean id="authRealm" class="com.chanb.www.controller.shiro.AuthRealm">
<property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>
登陆认证 凭证匹配器实现认证
<!--创建凭证匹配器-->
<bean id="credentialsMatcher"
class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--hashAlgorithmName 使用的算法名称
常见加密算法:
md5 128位二进制
sha1 160位二进制 -->
<property name="hashAlgorithmName" value="md5"/>
</bean>
举例中使用了md5加密,但是使用md5加密是远远不够的,我们可以加盐加密,我们可以自定义凭证匹配器
先创建一个类去继承SimpleCredentialsMatcher这个类重写它的doCredentialsMatch
方法 编写代码对密码加盐加密 以下为重写方法举例内容
/**
* 编写密码匹配逻辑
* @param token 用户输入的信息(用户名,密码)
* @param info 数据库的用户信息
* @return true,代表用户输入密码和数据库密码一致;
* false,代表用户输入密码和数据库密码不一致;
*/
@Override
public boolean doCredentialsMatch(AuthenticationToken token,
AuthenticationInfo info) {
//1.取出用户输入的信息
UsernamePasswordToken userToken = (UsernamePasswordToken)token;
//2.获取用户输入的密码
String password = new String(userToken.getPassword());
//3.进入md5加盐加密
Md5Hash md5Hash = new Md5Hash(password,userToken.getUsername());
//4.产生加密后密码
String md5Password = md5Hash.toString();
//5.取出数据库的密码
String dbPassword = (String)info.getCredentials();
//6.判断用户输入的密码 是否与 数据库密码一致
return dbPassword.equals(md5Password);
}
然后将自定义的凭证匹配器配置到Realm域中
<!--3. 配置自定义Realm域 -->
<bean id="authRealm" class="com.chanb.www.controller.shiro.AuthRealm">
<property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>
<!--创建自定义凭证匹配器-->
<bean id="credentialsMatcher" class="com.chanb.www.controller.shiro.CustomCredentialsMatcher"></bean>
</beans>
理解:先获取subject,使用subject的login方法将验证 ,login方法先在Reqlm中获取info,再进入匹配凭证器中对密码进行加盐加密与数据库中数据进行对比,如果不正确的话的抛出异常,数据匹配的话就正常进行login之后的代码
注销
// shiro也提供了退出方法(清除shiro的认证信息)
SecurityUtils.getSubject().logout();
授权验证
授权,也叫做授权访问校验 登陆认证后,系统校验用户是否有权限访问资源,就叫授权。
- 登陆后,获取用户的权限
- 访问资源时候,进行授权校验:用访问资源需要的权限去用户权限列表查找,如果存在,则
有权限访问资源。