1. 程式人生 > >使用Spring Security進行使用者許可權控制

使用Spring Security進行使用者許可權控制

系統比較簡單,所以只有使用者表, 角色表和域表, 沒有許可權表. 各個域的使用者是隔離的, 因為前後端分離, 控制起來格外不方便, 不過好歹是用filter實現了,bug還很多改天再說.
現在的問題就是登入 ,前端獲取登入使用者以及許可權攔截 .其中比較花時間的是使用者登入. 登入可以使用AuthenticationProvider 或者UserDetailsService實現,我傾向於使用前者,看起來DIY程度比較高,下面是程式碼:
@Component
public class CloudinsAuthProvider implements AuthenticationProvider {

@Autowired
CloudinsUserDao userDao;
@Autowired
CloudinsRoleDao roleDao;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials();
List<CloudinsUser> users = userDao
.fetchByAccount(username);
if(users.size()==0) {
users = userDao.fetchByName(username);
}
if(users.size()==0){
throw new BadCredentialsException("Account and username not found.");
}
CloudinsUserDetail dbUser = new CloudinsUserDetail(users.get(0));
//加密過程在這裡體現
if (!password.equals(dbUser.getPassword())) {
throw new
BadCredentialsException("Wrong password.");
}

Collection<? extends GrantedAuthority> authorities = dbUser.getAuthorities(roleDao);
return new UsernamePasswordAuthenticationToken(dbUser, password, authorities);
}

@Override
public boolean supports(Class<?> aClass) {
return true;
}
}
其中用到的user需要實現UserDetails介面,其中的屬性資訊我寫在父類中:
public class CloudinsUserDetail extends CloudinsUser implements UserDetails {

CloudinsUserDetail(){}
public CloudinsUserDetail(CloudinsUser user){
super(user);
}

@Deprecated
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return new ArrayList<>();
}
public Collection<? extends GrantedAuthority> getAuthorities(YarnJooqDao<CloudinsRole,Long> roleDao) {
List<GrantedAuthority> auth = new ArrayList<>();
CloudinsRole role = roleDao.fetchOneById(super.getRoleId());
auth.add(new SimpleGrantedAuthority(role.getName()));
return auth;
}

@Override
public String getPassword() {
return super.getPassword();
}

@Override
public String getUsername() {
return super.getAccount();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}
}
之後就是核心的WebSecurityConfigurerAdapter ,在這裡選擇使用者登入時的驗證方式,以及攔截配置:
@Configuration
//@EnableWebSecurity: 禁用Boot的預設Security配置,配合@Configuration啟用自定義配置
// (需要擴充套件WebSecurityConfigurerAdapter)
@EnableWebSecurity
//@EnableGlobalMethodSecurity(prePostEnabled = true): 啟用Security註解,
// 例如最常用的@PreAuthorize
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CloudinsSecurity extends WebSecurityConfigurerAdapter {
@Autowired
private CloudinsAuthProvider provider;
@Autowired
private CloudinsUserDetailsService userService;
//兩種驗證使用者方式選一種
// @Override
// protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(this.userService);
// }
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(provider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()

.antMatchers("/help","/api/v1/manage/user_register","/api/v1/manage/user","/**/*.js","/**/*.json","/**/*.html","/**/*.css","/**/*.png",
"/**/*.jpg", "/**/*.gif","/**/*.woff2","/**/*.svg","/**/*.ttf","/**/*.eot","/**/*.map")
.permitAll()
.anyRequest().authenticated()
.antMatchers("/warn","/sysetting","/setting","/api/v1/manage/roles","/api/v1/receive/*")
.hasAnyRole(Const.ROLE_SUPER_ADMIN)
.and().formLogin().loginPage("/user_login").loginProcessingUrl("/login_process")
.successForwardUrl("/api/v1/manage/user").permitAll()
.and().logout().permitAll();
// 關閉csrf 防止迴圈定向
http.csrf().disable();
}


}
以上定義了使用AuthenticationProvider 進行使用者驗證,對很多靜態資源不做攔截,其他url需要登入,某些url需要特定角色才能開啟,登入頁面是/user_login,登入表單提交url是/login_process. 於是我們就完成了簡單的使用者分級許可權控制,關於具體的mvc方法,還能用註解單獨控制:
@PreAuthorize("hasAnyRole('ROLE_FIELD_ADMIN','ROLE_SUPER_ADMIN')")
@RequestMapping(value = "/users", method = RequestMethod.DELETE)
public ResponseEntity<Map<String, Object>> removeUser(@RequestParam Long id) {...}

相關推薦

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

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

使用Spring Security進行使用者許可權控制

系統比較簡單,所以只有使用者表, 角色表和域表, 沒有許可權表. 各個域的使用者是隔離的, 因為前後端分離, 控制起來格外不方便, 不過好歹是用filter實現了,bug還很多改天再說. 現在的問題就是登入 ,前端獲取登入使用者以及許可權攔截 .其中比較花時間的是使用者登入

淺談spring security中的許可權控制

當我們在OAuth登陸後,獲取了登陸的令牌,使用該令牌,我們就有了訪問一些受OAuth保護的介面的能力。具體可以看本人的這兩篇部落

Spring Security 動態url許可權控制(三)

一、前言 本篇文章將講述Spring Security 動態分配url許可權,未登入許可權控制,登入過後根據登入使用者角色授予訪問url許可權 基本環境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 資料庫 maven專案 Spring Security入門學習可參

別再讓你的微服務裸奔了,基於 Spring Session & Spring Security 微服務許可權控制

微服務架構 閘道器:路由使用者請求到指定服務,轉發前端 Cookie 中包含的 Session 資訊; 使用者服務:使用者登入認證(Authentication),使用者授權(Authority),使用者管理(Redis Session Management) 其他服務:依賴 Redis 中使用者資

Spring Boot中使用Spring Security實現權限控制

unicode then add sta spa 攔截器 nco throw views Spring Boot框架我們前面已經介紹了很多了,相信看了前面的博客的小夥伴對Spring Boot應該有一個大致的了解了吧,如果有小夥伴對Spring Boot尚不熟悉

spring實戰-Spring-security實現使用者許可權認證登入

第八篇:Spring-security實現使用者許可權認證登入 spring-security原本是Acegi Security元件,該元件是一個強大的安全框架,但是使用方式很繁瑣,要配置幾百行XML。整合進Spring後,就可以通過xml或者JavaConfig的方式,很容易的就實現了系統

javaEE shiro框架,許可權控制。基於Spring框架的shiro許可權控制

許可權控制的方式: 方式一:通過過濾器或Struts2的攔截器實現許可權控制 方式二:為Struts2的Action加入註解(標識),然後為Action建立代理物件;代理物件進行許可權校驗,校驗通過後通過反射呼叫目標方法。 shiro框架可以進行認證、授權、會話管理、加

Spring整合Shiro做許可權控制模組詳細案例分析

1.引入Shiro的Maven依賴 <!-- Spring 整合Shiro需要的依賴 --> <dependency> <groupId>org.apache.shiro</groupId> <artifac

freemarker 使用spring security標籤進行許可權判斷以及錯誤解決

freemarker  使用spring security標籤進行許可權判斷,配置起來非常簡單。 網上有很多例子,簡單配置步驟如下:  pom.xml 中加入spring security支援 <dependency>

Spring Security學習筆記-許可權快取

SpringSecurity-許可權快取    SpringSecurity的許可權快取和資料庫管理有關,都是在使用者認證上做文章,因此都與UserDetailsService有關,與資料庫管理不同的是,SpringSecurity提供了一個實現了可以快取UserDetailsServi

Spring Security原理學習--許可權校驗(四)

      在上一篇部落格Spring Security原理學習--使用者名稱和密碼認證(三)中我們已經瞭解到Spring Security關於使用者名稱和密碼在UsernamePasswordAuthenticationFilter中的認證處理邏輯,接下來我們看看許可權的校

springboot2.0--結合spring security5.0進行許可權控制,從資料庫中取許可權資訊及增加驗證碼

  1.在pom.xml中增加spring security jar的引用:      <!--引入spring security--> <dependency> <groupId>org.springframework

spring boot註解實現許可權控制

1、自定義註解 Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RoleCheck { String[] roles() default

SPRING註解形式實現許可權控制

今天看了一下黑馬程式設計師的視訊,上面講到一個使用spring AOP + 自定義註解的方式來實現許可權控制的一個小例子,個人覺得還是可以借鑑,整理出來與大家分享。 需求:service層有一些方法,這些方法需要不同的許可權才能訪問。 實現方案:自定義一個Privilege

spring security 登入、許可權管理配置

登入流程 1)容器啟動(MySecurityMetadataSource:loadResourceDefine載入系統資源與許可權列表)  2)使用者發出請求  3)過濾器攔截(MySecurityFilter:doFilter)  4)取得請求資源所需許可權(MySe

Shiro+Spring+Struts2整合演示許可權控制

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/jav

基於Spring框架應用的許可權控制系統的研究和實現

摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring本身沒有提供對系統的安全性支援。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的互動,並通過擴充套件Acegi資料庫設計來實現基於Spring框架的應用的安全控制方法。

Spring Security的使用(訪問許可權控制)

訪問許可權控制 粗粒度:對一個功能的訪問進行控制 細粒度:對該功能下的資料顯示進行控制 注意:許可權控制,需要在spring-mvc.xml中配置,否則會導致失效 <aop:aspectj-autoproxy proxy-target-class="true"></a

spring security基於方法的許可權控制

1.1     intercept-methods定義方法許可權控制        intercept-methods是需要定義在bean元素下的,通過它可以定義對當前的bean的某些方法進行許可權控制,具體方法是使用其下的子元素protect進行定義的。protect元素