SpringBoot整合Shiro實現登錄攔截以及認證授權功能

一、Shiro是什麼?

Apache Shiro是一個Java安全權限框框架。

Shiro可以非常容易的開發出足夠好的應用,其不僅可以在javaEE環境。

Shiro可以完成,認證,授權,加密,會話管理,Web集成,緩存等。

二、Shiro工作原理

應用代碼的交互對象是 “Subject”,該對象代表了當前 “用戶”,而所有用戶的安全操作都會交給 SecurityManager 來管理,而管理過程中會從 Realm 中獲取用戶對應的角色和權限,可以把 Realm 堪稱是安全數據源。
 
也就是說,我們要使用最簡單的 Shiro 應用:
  • 通過 Subject 來進行認證和授權,而 Subject 又委託給了 SecurityManager 進行管理
  • 我們需要給 SecurityManager 注入 Realm 以便其獲取用戶和權限進行判斷
  • 也即,Shiro 不提供用戶和權限的維護,需要由開發者自行通過 Realm 注入

三、SpringBoot整合Shiro

1.xml導入jar包

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>

2.config目錄下創建ShiroConfig.java,攔截以及授權等功能都在這裏配置

@Configuration
public class ShiroConfig {
    //1.創建realm對象 需要自定義
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }

    //2.DefaultWebSecurityManager
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //關聯UserRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //3.ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //設置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro的內置過濾器
        /**
         * anon:無需認證就可以訪問
         * authc:必須認證了才能訪問
         * user:必須擁有 記住我 功能才能用
         * perms:擁有對某個資源的權限才能訪問
         * role:擁有某個角色權限才能訪問
         */
        Map<String, String> filterMap = new LinkedHashMap<>();
        //授權
        filterMap.put("/user/add","perms[user:add]"); //進入需要授權(授權規則用戶後面接:add)纔可以進入add
        filterMap.put("/user/update","perms[user:update]");

        //攔截功能
        filterMap.put("/user/*","authc"); //表示訪問user接口的資源都要認證
        bean.setFilterChainDefinitionMap(filterMap);

        //******處理權限不夠或者需要授權的業務********
        //如果沒有權限authc 設置登錄的請求
        bean.setLoginUrl("/toLogin");
        //未授權頁面
        bean.setUnauthorizedUrl("/noauth");
        return bean;
    }
}

3.自定義UserRealm類,繼承AuthorizingRealm重寫用戶授權和用戶認證的方法

public class UserRealm extends AuthorizingRealm {//用戶授權
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//        info.addStringPermission("user:add"); 手動添加了權限

        //拿到當前登錄的這個對象
        Subject subject= SecurityUtils.getSubject();
        User currentUser = (User) subject.getPrincipal(); //拿到user對象 可以設置用戶權限
        //設置當前用戶的權限 從數據庫上面拿
        info.addStringPermission(currentUser.getPerms());
        System.out.println(currentUser.getPerms());
        return info;
    }

    //用戶認證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        //認證用戶(連接數據庫)
        User user = userService.queryUserByName(userToken.getUsername());
        if(user==null){
            return null; //UnknownAccountException
        }

        //判斷session是否有值,顯示登錄按鈕
        Subject currentSubject = SecurityUtils.getSubject();
        Session session = currentSubject.getSession();
        session.setAttribute("loginUser",user);

        //可以加密:MD5 MD5鹽值加密(更高級)
        //密碼認證(shiro完成)
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }
}

 

Shiro大致的配置就在這裏了,具體功能如攔截功能、授權認證功能,可以在我的碼雲https://gitee.com/chen_student/springboot_learning下載springboot_shiro_mybatis工程,進行查看。

Shiro核心概述可參考文章:https://www.cnblogs.com/deng-cc/p/9401900.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章