1、springboot与shiro整合实现用户登录认证2020-09-14

1、分析shiro的核心API

(1)Subjet:用户主体(登录、注销、判断授权的一些方法)(把操作交给Securitymanager)
(2)Securitymanager:安全管理器(需要关联Realm)
(3)Realm:Shiro连接数据的桥梁

2、Springboot整合shiro

(1)导入shiro与spring整合依赖,修改pom.xml

        
            org.apache.shiro
            shiro-spring
            1.4.0
        
(2)自定义Realm类

创建一个UserRealm

/*
*
*   自定义Realm
* */
public class UserRealm extends AuthorizingRealm {

    /*
    * 执行授权逻辑
    * */

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权逻辑");
        return null;
    }

    /*
     * 执行认证的逻辑
     *
     * */

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行认证的逻辑");
        return null;
    }
}

(3)编写shiro的配置类*****

创建ShiroConfig

package com.bookkeeping.shiro;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

    /*
    *   shiro的配置类
    * */
@Configuration
public class ShiroConfig {
    /*
    *   1、创建ShiroFilterFactoryBean
    **/
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        /*设置安全管理器*/
        shiroFilterFactoryBean.setSecurityManager( securityManager );
        return shiroFilterFactoryBean;
    }
    /*
    *   2、创建DefaultWebSecurityManager
    **/
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        /*管理Realm*/
        securityManager.setRealm( userRealm);
        return securityManager;
    }
   /*
    *   3、创建Realm
    *
    *   @Bean方法返回的对象放入spring环境
    *  */
   @Bean(name ="userRealm" )
   public UserRealm getRealm(){
       return new UserRealm();
   }

}

(4)使用shiro内置过滤器实现页面拦截(配置ShiroConfig

常用过滤器
* 1、anon:无需认证(登录可以访问)
* 2、authc:必须认证才可以访问
* 3、user:如果使用rememberMe的功能,可以直接访问
* 4、perms:该资源必须得到资源权限才可以访问
* 5、role:该资源必须得到角色权限才可以访问

①、创建map集合来存储过滤器
②、设置页面被拦截后的跳转页面(目前为登录页面)
③、配置拦截页面和放行界面

必须加一个 “/”

package com.bookkeeping.shiro;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/*
    *   shiro的配置类
    * */
@Configuration
public class ShiroConfig {
    /*
    *   1、创建ShiroFilterFactoryBean
    **/
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        /*设置安全管理器*/
        shiroFilterFactoryBean.setSecurityManager( securityManager );

        /*添加shiro内置过滤器(实现权限相关的拦截)
        *
        * 常用过滤器
        *   1、anon:无需认证(登录可以访问)
        *   2、authc:必须认证才可以访问
        *   3、user:如果使用rememberMe的功能,可以直接访问
        *   4、perms:该资源必须得到资源权限才可以访问
        *   5、role:该资源必须得到角色权限才可以访问
        * */

        /*(--)创建map集合来存储过滤器*/
        Map filterMap=new LinkedHashMap <>(  );

        /*拦截的页面,如果全部拦截添加 /* */
        filterMap.put("/*","authc");

        /*设置放行页面  必须加一个 “/” */
        filterMap.put("/gologin","anon");

        /*(--)修改跳转的登录页面*/
        shiroFilterFactoryBean.setLoginUrl( "gologin" );

        /*(--)将过滤内容放到过滤器*/
        shiroFilterFactoryBean.setFilterChainDefinitionMap( filterMap );

        return shiroFilterFactoryBean;
    }
    /*
    *   2、创建DefaultWebSecurityManager
    **/
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        /*管理Realm*/
        securityManager.setRealm( userRealm);
        return securityManager;
    }
   /*
    *   3、创建Realm
    *
    *   @Bean方法返回的对象放入spring环境
    *  */
   @Bean(name ="userRealm" )
   public UserRealm getRealm(){
       return new UserRealm();
   }

}

(4)实现用户登录(认证)操作

①、编写登录逻辑

编写model 、.xml 、dao 、service

dao:(为通过用户名查询用户);

  /*通过用户名查询用户*/
    Admin selectAdminByName(@Param( "uname" ) String uname);

mapper