1. 程式人生 > >SpringBoot許可權控制

SpringBoot許可權控制

許可權控制是一個比較重要的知識點。
先講一下相關理論知識,如圖:
這裡寫圖片描述
每次傳送請求都會呼叫到controller,而controller又會呼叫subject,每個使用者對應一個subject(subject包含了session),且subject會負責和shiro互動,securityManager管理了Realm,而Realm可以進行登入驗證,可以對使用者操作付許可權。
通過SpringBoot做許可權控制的步驟如下:
1、首先要引入相應的包。
除了要引入其他基本功能的包,還要引入和許可權控制相關的包,pom程式碼如下:

<dependency>
    <groupId
>
org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.2.0</version>
</dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.2.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId
>
<version>1.2.0</version> </dependency>

2、自定義Realm 繼承自AuthorizingRealm:

package com.mySpringBoot.shiro;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import com.mySpringBoot.bean.Module;
import com.mySpringBoot.bean.Role;
import com.mySpringBoot.bean.User;
import com.mySpringBoot.service.UserService;

/** 
 * @Description AuthRealm完成根據使用者名稱去資料庫的查詢,並且將使用者資訊放入shiro中,供第二個類呼叫.CredentialsMatcher,完成對於密碼的校驗.其中使用者的資訊來自shiro 
 * @ClassName   AuthRealm 
 * @Date        2017年8月30日 下午9:05:03 
 * @Author      動腦學院-jack
 */
public class AuthRealm extends AuthorizingRealm {
    @Autowired
    private UserService service;

    //認證.登入
    /* 
     *這個方法主要是做登入驗證,說白了就是去資料庫裡面校驗使用者是否存在,注意這裡不需要進行祕密校驗,shiro會幫我們做密碼校驗
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        try {
            UsernamePasswordToken utoken = (UsernamePasswordToken)token;//獲取使用者輸入的token
            String username = utoken.getUsername();
            User user = service.findUserByName(username);
            if (user != null) {
                // 若存在,將此使用者存放到登入認證info中,無需自己做密碼對比,Shiro會為我們進行密碼對比校驗
                return new SimpleAuthenticationInfo(user, user.getPassword(),
                        this.getClass().getName());//放入shiro.呼叫CredentialsMatcher檢驗密碼
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //授權
    /* 
     * 授權的方法是在碰到<shiro:hasPermission>標籤的時候呼叫的,它會去檢測shiro框架中的許可權(這裡的permissions)是否包含有該標籤的name值,如果有,裡面的內容顯示,如果沒有,裡面的內容不予顯示(這就完成了對於許可權的認證.)
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principal) {
        User user = (User)principal.fromRealm(this.getClass().getName())
                .iterator()
                .next();//獲取session中的使用者
        List<String> permissions = new ArrayList<String>();
        Set<Role> roles = user.getRoles();
        if (roles.size() > 0) {
            for (Role role : roles) {
                Set<Module> modules = role.getModules();
                if (modules.size() > 0) {
                    for (Module module : modules) {
                        permissions.add(module.getMname());
                    }
                }
            }
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermissions(permissions);//將許可權放入shiro中.
        return info;
    }
}

3、密碼校驗器:

package com.mySpringBoot.shiro;

import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;

/** 
 * @Description 這個類進行祕密的校驗 
 * @ClassName   CredentialsMatcher 
 * @Date        2017年8月30日 下午9:17:29 
 * @Author      動腦學院-jack
 */
public class CredentialsMatcher extends SimpleCredentialsMatcher {

    @Override
    public boolean doCredentialsMatch(AuthenticationToken token,
            AuthenticationInfo info) {
        UsernamePasswordToken utoken = (UsernamePasswordToken)token;
        //獲得使用者輸入的密碼
        String inPassword = new String(utoken.getPassword());
        //獲得資料庫中的密碼
        String dbPassword = (String)info.getCredentials();
        //進行密碼的比對
        return this.equals(inPassword, dbPassword);
    }
}

4、新建許可權管理類:
這一步首先需要定義一個方法返回ShiroFilterFactoryBean,ShiroFilterFactoryBean物件要設定登入的URL,設定哪些路徑是可以匿名訪問,哪些是需要許可權訪問的。

@Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(
            @Qualifier("securityManager") SecurityManager manager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(manager);
        //配置登入的url和登入成功的url
        bean.setLoginUrl("/login");
        bean.setSuccessUrl("/home");
        //配置訪問許可權
        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/jsp/login.jsp*", "anon"); //表示可以匿名訪問,anon表示不需要攔截
        filterChainDefinitionMap.put("/loginUser", "anon");
        filterChainDefinitionMap.put("/logout*", "anon");
        filterChainDefinitionMap.put("/jsp/error.jsp*", "anon");
        filterChainDefinitionMap.put("/jsp/index.jsp*", "authc");
        filterChainDefinitionMap.put("/*", "authc");//表示需要認證才可以訪問
        filterChainDefinitionMap.put("/**", "authc");//表示需要認證才可以訪問
        filterChainDefinitionMap.put("/*.*", "authc");
        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return bean;
    }

然後配置核心安全事務管理器,返回SecurityManager物件:

//配置核心安全事務管理器
    @Bean(name = "securityManager")
    public SecurityManager securityManager(
            @Qualifier("authRealm") AuthRealm authRealm) {
        System.err.println("--------------shiro已經載入----------------");
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(authRealm);
        return manager;
    }

設定密碼比較器:

//配置自定義的密碼比較器
    @Bean(name = "credentialsMatcher")
    public CredentialsMatcher credentialsMatcher() {
        return new CredentialsMatcher();
    }

配置自定義的許可權登入器:

@Bean(name = "authRealm")
    public AuthRealm authRealm(
            @Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
        AuthRealm authRealm = new AuthRealm();
        authRealm.setCredentialsMatcher(matcher);
        return authRealm;
    }

總體程式碼:

package com.mySpringBoot.shiro;

import java.util.LinkedHashMap;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShiroConfiguration {

    @Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(
            @Qualifier("securityManager") SecurityManager manager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(manager);
        //配置登入的url和登入成功的url
        bean.setLoginUrl("/login");
        bean.setSuccessUrl("/home");
        //配置訪問許可權
        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/jsp/login.jsp*", "anon"); //表示可以匿名訪問,anon表示不需要攔截
        filterChainDefinitionMap.put("/loginUser", "anon");
        filterChainDefinitionMap.put("/logout*", "anon");
        filterChainDefinitionMap.put("/jsp/error.jsp*", "anon");
        filterChainDefinitionMap.put("/jsp/index.jsp*", "authc");
        filterChainDefinitionMap.put("/*", "authc");//表示需要認證才可以訪問
        filterChainDefinitionMap.put("/**", "authc");//表示需要認證才可以訪問
        filterChainDefinitionMap.put("/*.*", "authc");
        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return bean;
    }
    //配置核心安全事務管理器
    @Bean(name = "securityManager")
    public SecurityManager securityManager(
            @Qualifier("authRealm") AuthRealm authRealm) {
        System.err.println("--------------shiro已經載入----------------");
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(authRealm);
        return manager;
    }

    //配置自定義的許可權登入器
    @Bean(name = "authRealm")
    public AuthRealm authRealm(
            @Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
        AuthRealm authRealm = new AuthRealm();
        authRealm.setCredentialsMatcher(matcher);
        return authRealm;
    }

    //配置自定義的密碼比較器
    @Bean(name = "credentialsMatcher")
    public CredentialsMatcher credentialsMatcher() {
        return new CredentialsMatcher();
    }

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
        creator.setProxyTargetClass(true);
        //        creator.setOrder(1);
        return creator;
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
            @Qualifier("securityManager") SecurityManager manager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(manager);
        //        advisor.setOrder(0);
        return advisor;
    }
}

相關推薦

SpringBoot許可權控制

許可權控制是一個比較重要的知識點。 先講一下相關理論知識,如圖: 每次傳送請求都會呼叫到controller,而controller又會呼叫subject,每個使用者對應一個subject(subject包含了session),且subject會負責和s

springboot-許可權控制shiro(一)

1. 場景描述 (1)許可權控制是IT專案特別是企業專案,繞不開的重要模組,接下來結合springboot介紹下許可權控制框架shiro。 (2)springboot整合shiro的東西有點多,一篇部落格完全介紹清楚有點費勁,擬分成3篇吧,第一篇介紹概念、原理;第二篇介紹搭建程式碼,詳細介紹shiro框架;第

springboot-許可權控制shiro(二)

目錄 1. 場景描述 2. 解決方案 1. 場景描述 (1)最近有點小忙,公司真實專案內容有點小多以及不想只介紹理論,就使用springboot單獨部署了個shiro的demo專案,還是理論和實際項結合比較好理

成長記錄貼之springboot+shiro(二) {完成一個完整的許可權控制,詳細步驟}

       近一個月比較忙,公司接了一個新專案,領導要求用shiro進行安全管理,而且全公司只有我一個java,從專案搭建到具體介面全是一個人再弄。不過剛好前段時間大概學習了一下shiro的使用,還算順利。       &n

springboot使用Spring Security+OAuth2做許可權控制

文章來源:http://lxgandlz.cn/404.html     前面有一篇文章Spring+Spring Security+OAuth2實現REST API許可權控制,講了Spring+Spring Security+OAuth2來實現REST API許可權

springboot配置shiro許可權管理,網搜搜採集網站許可權控制程式碼

import outshine.shiro.authc.AccountSubjectFactory; import outshine.shiro.filter.AuthenticatedFilter; import outshine.shiro.realm.AccountRealm; import or

SpringbootSpringboot + spring boot admin 監控 spring security許可權控制

Springboot admin 很好的提供了對Springboot的監控,但是不建議直接將admin整合到已有的專案中。於是我另起一個專案,考慮到不能讓所有人都能看到這些資料了,於是引入了spring security。   本次使用的是spring-boot-admin-s

springboot+springsecurity+cas實現sso,並開啟註解方法級別的許可權控制

springsecurity整合cas springsecurity的springsecurityfilterchian中有一個cas的攔截器位置,因此可以通過它把cas整合進springsecurity中 cas負責認證,security通過userDetails負責載入許可權,通過認證管理器

SpringBoot+shiro整合學習之登入認證和許可權控制

學習任務目標 使用者必須要登陸之後才能訪問定義連結,否則跳轉到登入頁面。 對連結進行許可權控制,只有噹噹前登入使用者有這個連結訪問許可權才可以訪問,否則跳轉到指定頁面。 輸入錯誤密碼使用者名稱或則使用者被設定為靜止登入,返回相應json串資訊 匯

springboot整合security實現基於url的許可權控制

  許可權控制基本上是任何一個web專案都要有的,為此spring為我們提供security模組來實現許可權控制,網上找了很多資料,但是提供的demo程式碼都不能完全滿足我的需求,因此自己整理了一版。   在上程式碼之前,大家需要理解兩個過程:認證和授權   使用者登陸,會被AuthenticationPro

springboot整合shiro 實現許可權控制

shiro apache shiro 是一個輕量級的身份驗證與授權框架,與spring security 相比較,簡單易用,靈活性高,springboot本身是提供了對security的支援,畢竟是自家的東西。springboot暫時沒有整合shiro,這得自

SpringBoot整合Springsecurity實現資料庫登入以及許可權控制

我們今天使用SpringBoot來整合SpringSecurity,來吧,不多BB 首先呢,是一個SpringBoot 專案,連線資料庫,這裡我使用的是mybaties.mysql, 下面是資料庫的表 DROP TABLE IF EXISTS `xy_role`; CR

SpringBoot學習筆記(六):SpringBoot實現Shiro登入控制許可權控制

登入模組:在登入時必須呼叫 授權模組:不是一登入就調動,而是當角色許可權控制時才會呼叫 登入控制 環境搭建在上一篇。 資料庫表 表名:role 欄位:id rolename 表名:user 欄位:id username sex roleid 在程式碼中簡歷資料庫表對應的實

springboot+shiro+mybatis實現角色許可權控制

背景 spring+spirngmvc+shiro的整合已經有很多了,之前的專案中也用過,但是最近想在springboot中使用shiro這樣,其他專案需要的時候只需要把它依賴進來就可以直接使用,至於shiro的原理其他的blog都有很多介紹。這裡只講幾個重點

SpringBoot中使用Spring Security實現許可權控制

Spring Security,這是一個專門針對基於Spring的專案的安全框架,它主要是利用了AOP來實現的。以前在Spring框架中使用Spring Security需要我們進行大量的XML配置,但是,Spring Boot針對Spring Security

SpringBoot+SpringSecurity+JWT實RESTfulAPI許可權控制

工具類JwtTokenUtil:package org.security.util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import or

springboot+security restful許可權控制官方推薦(五)

繼前幾篇部落格將使用者、角色、許可權資訊都存在資料,實現管理許可權到請求方法級別。感覺那種實現方式比較雞肋,不太實用。所以今天說一下,官方推薦的註解方式控制權限到請求方法級別的實現。 官方推薦的方法是將使用者、角色資訊存在資料庫,而角色和許可權的對應關係,通過

springboot shiro許可權控制講解01 每天進步百分之一

許可權大體分兩種,操作許可權和資料許可權,以下主要講操作許可權的控制 操作許可權是一個管理系統的基本功能,最最簡單的就是驗證使用者的帳號和密碼了 那既然驗證,就有一張使用者表了,想起這個就想起的大學老師佈置做的學生管理系統了 第一天 學生登入檢視自己的基本

Springboot+SpringMVC+Myabtis整合shiro許可權控制

最近也被這個難題搞的我頭都大了額。寫下此篇文章獻給自己和廣大朋友。如果有不懂的地方可以加企鵝號詢問哦。 企鵝號:2054861587,不一定會時時在,但如果有空的話就會給你回答 maven依賴: <dependency> <groupId>

SpringBoot--- SpringSecurity進行登出,許可權控制

## SpringBoot--- SpringSecurity進行登出,許可權控制 ### 環境 IDEA :2020.1 Maven:3.5.6 SpringBoot: **2.0.9** (與此前整合的版本2.3.3 不同,版本適配問題,為配合使用降級) ### 1、登出 這裡也有一個前提問題