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();

授权验证

授权,也叫做授权访问校验 登陆认证后,系统校验用户是否有权限访问资源,就叫授权。

  1. 登陆后,获取用户的权限
  2. 访问资源时候,进行授权校验:用访问资源需要的权限去用户权限列表查找,如果存在,则
    有权限访问资源。
posted @ 2022-06-10 00:31  轻封侯  阅读(366)  评论(0编辑  收藏  举报