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
Springboot: Springboot + 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、登出 這裡也有一個前提問題