spring-boot 整合 spring-security
- 引入相關包;
- 配置程式碼(SecurityConfig ,UserDetailsServiceImpl ,UserSecurity )
- 重點:
- config 配置
hasRole ("ADMIN")
一定要在authenticated
前面,也就是說配置規則遵從從上往下的順序 request.getRequestDispatcher(newUrl).forward(request, response)
跳轉之後不會進入後續攔截器,也就是說不會被security管理了。
- config 配置
- 程式碼參考
@EnableAutoConfiguration
@ComponentScan
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 目前只供測試用例使用
* 模擬 UserDetailsService 驗證,便於許可權測試直接使用@WithUserDetails(@MockWidthUser需要指定使用者名稱和密碼)
*/
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = (UserDetails) new User("admin", "abc123456",
AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));//授予 admin角色
return new InMemoryUserDetailsManager(Arrays.asList(userDetails));
}
/**
* 使用者認證,主要是根據使用者名稱獲取使用者角色、許可權,來匹配使用者登入和使用者是否有許可權操作
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
/**
* 訪問許可權過濾
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
// We recommend disabling CSRF protection completely only if you are creating a
// service that is used by non-browser clients
// 以此支援非瀏覽器 post 訪問 shutdown
http.csrf().disable();
// 新增自定義過濾器,額外處理
http.addFilterBefore(new RouterFilter(), AnonymousAuthenticationFilter.class);
http.authorizeRequests()
.antMatchers("/assets/**", "/**/*.*", "/mocksession/**",
"/session/weixin", "/session/github").permitAll()
// 安全關閉服務介面,擁有 ADMIN 許可權的使用者可以訪問該 rul
.antMatchers("/actuator/shutdown").hasRole("ADMIN")
.antMatchers("/app/redeploy").hasRole("ADMIN")
.anyRequest().authenticated() // 任何請求,登入後可以訪問
.and()
.formLogin()
.loginPage("/")
.permitAll()
// 開啟basic認證,若不新增此項,將不能通過curl的basic方式傳遞使用者資訊
.and()
.httpBasic()
.and()
// 重定向url由預設值/login?logout改為/
.logout()
.logoutSuccessUrl("/")
.permitAll()
.invalidateHttpSession(true);
}
}
UserDetailsServiceImpl 實現
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = userService.getByLoginName(username);
if (userInfo == null) {
throw new UsernameNotFoundException(username + " 不存在!");
}
// 加密密碼
String encode = passwordEncoder.encode(UserSecurity.getInternalPassword());
if (userInfo.isAdmin()) {
return new User(username, encode, AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
} else {
return new User(username, encode, AuthorityUtils.commaSeparatedStringToAuthorityList(""));
}
}
}
整合使用者自定義登入session,轉接到security,使用如下工具類setUser
public class UserSecurity {
public static void setUser(UserInfo userInfo) {
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(userInfo.getLoginName(), getInternalPassword());
SecurityContextHolder.getContext().setAuthentication(authRequest);
}
public static String getInternalPassword() {
return "abc123456";
}
}
相關文章
- spring-boot整合kindeditorSpringboot
- Spring-Boot整合RedisSpringbootRedis
- spring-boot spring-security oauth2 /oauth/token報401,403 問題SpringbootOAuth
- spring-boot 整合 spring-sessionSpringbootSession
- spring-boot專案的docker整合化部署(一)SpringbootDocker
- Spring-boot整合AOP及AOP相關學習Springboot
- spring-security原始碼-FilterChainProxySpring原始碼FilterAI
- Mokito 單元測試與 Spring-Boot 整合測試Springboot
- Spring-Boot整合通用PageHelper外掛遇到的問題Springboot
- Apache Camel與Spring-boot和Kafka的整合開源案例ApacheSpringbootKafka
- spring-boot 整合mybatis-plus 組成後臺開發基本框架SpringbootMyBatis框架
- spring-boot快速入門學習筆記-整合JPA mybatis rabbitmq mongodb redisSpringboot筆記MyBatisMQMongoDBRedis
- Spring-Boot快速上手Springboot
- spring-boot啟動Springboot
- spring-boot 中使用 FastDFSSpringbootAST
- Spring-boot國際化Springboot
- spring-boot參考文章Springboot
- 【spring-boot】自定義starterSpringboot
- spring-boot記錄sql探索SpringbootSQL
- spring-boot mybatis 連線MySQLSpringbootMyBatisMySql
- spring-boot入門程式詳解Springboot
- spring-boot登陸過濾功能Springboot
- Spring-boot模組化程式設計Springboot程式設計
- spring-boot - 編寫自己的starterSpringboot
- 使用gradle管理spring-boot專案GradleSpringboot
- spring-boot 統一異常捕獲Springboot
- 一個簡單的spring-boot例子Springboot
- spring-boot 同時配置Oracle和MySQLSpringbootOracleMySql
- Decoration1:Spring-boot基礎實現Springboot
- spring-boot學習筆記之ConditionalSpringboot筆記
- Spring Boot學習5:spring-boot web容器Spring BootWeb
- android界的spring-boot http服務框架AndroidSpringbootHTTP框架
- spring-boot版本問題讓開發懷疑人生Springboot
- Spring-Boot專案中配置redis註解快取SpringbootRedis快取
- spring-boot + jsonp 解決前端跨域問題SpringbootJSON前端跨域
- Spring-Boot:5分鐘掌握SpringBoot開發Spring Boot
- 把spring-boot專案部署到tomcat中的方法SpringbootTomcat
- spring-boot專案在外部tomcat環境下部署SpringbootTomcat