From ef36fd32d67a028724858701d582f1e3da194c5d Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Thu, 13 Dec 2018 11:22:53 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-rbac-security=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rbac/security/config/CustomConfig.java | 29 +++++++++++ .../config/JwtAuthenticationFilter.java | 50 +++++++++++-------- .../rbac/security/config/SecurityConfig.java | 25 ++++++++-- .../src/main/resources/application.yml | 5 ++ 4 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java new file mode 100644 index 0000000..3a691232 --- /dev/null +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java @@ -0,0 +1,29 @@ +package com.xkcoding.rbac.security.config; + +import com.google.common.collect.Lists; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.List; + +/** + *

+ * 自定义配置 + *

+ * + * @package: com.xkcoding.rbac.security.config + * @description: 自定义配置 + * @author: yangkai.shen + * @date: Created in 2018-12-13 10:56 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@ConfigurationProperties(prefix = "custom.config") +@Data +public class CustomConfig { + /** + * 不需要拦截的地址 + */ + private List ignores = Lists.newArrayList(); +} diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtAuthenticationFilter.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtAuthenticationFilter.java index 845772c..67f0b5c 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtAuthenticationFilter.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/JwtAuthenticationFilter.java @@ -1,5 +1,6 @@ package com.xkcoding.rbac.security.config; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.xkcoding.rbac.security.common.Status; import com.xkcoding.rbac.security.exception.SecurityException; @@ -12,8 +13,8 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.stereotype.Component; -import org.springframework.util.AntPathMatcher; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; @@ -44,32 +45,41 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Autowired private JwtUtil jwtUtil; + @Autowired + private CustomConfig customConfig; + @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - AntPathMatcher antPathMatcher = new AntPathMatcher(); - if (antPathMatcher.match("/**/api/auth/**", request.getRequestURI())) { - filterChain.doFilter(request, response); - } else { - String jwt = jwtUtil.getJwtFromRequest(request); + if (CollUtil.isNotEmpty(customConfig.getIgnores())) { + for (String ignore : customConfig.getIgnores()) { + AntPathRequestMatcher matcher = new AntPathRequestMatcher(ignore); + if (matcher.matches(request)) { + filterChain.doFilter(request, response); + return; + } + } + } - if (StrUtil.isNotBlank(jwt)) { - try { - String username = jwtUtil.getUsernameFromJWT(jwt); + String jwt = jwtUtil.getJwtFromRequest(request); - UserDetails userDetails = customUserDetailsService.loadUserByUsername(username); - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + if (StrUtil.isNotBlank(jwt)) { + try { + String username = jwtUtil.getUsernameFromJWT(jwt); - SecurityContextHolder.getContext() - .setAuthentication(authentication); - filterChain.doFilter(request, response); - } catch (SecurityException e) { - ResponseUtil.renderJson(response, e); - } - } else { - ResponseUtil.renderJson(response, Status.UNAUTHORIZED, null); + UserDetails userDetails = customUserDetailsService.loadUserByUsername(username); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + + SecurityContextHolder.getContext() + .setAuthentication(authentication); + filterChain.doFilter(request, response); + } catch (SecurityException e) { + ResponseUtil.renderJson(response, e); } + } else { + ResponseUtil.renderJson(response, Status.UNAUTHORIZED, null); } + } } diff --git a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java index f5fdcd7..0d9af81 100644 --- a/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java +++ b/spring-boot-demo-rbac-security/src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java @@ -1,20 +1,22 @@ package com.xkcoding.rbac.security.config; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; import com.xkcoding.rbac.security.service.CustomUserDetailsService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; /** *

@@ -31,7 +33,11 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; */ @Configuration @EnableWebSecurity +@EnableConfigurationProperties(CustomConfig.class) public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + private CustomConfig customConfig; + @Autowired private AccessDeniedHandler accessDeniedHandler; @@ -76,8 +82,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // 认证请求 .authorizeRequests() // 放行 /api/auth/** 的所有请求,参见 AuthController - .antMatchers("/**/api/auth/**") - .permitAll() + //.antMatchers("/api/auth/**") + //.permitAll() .anyRequest() .authenticated() // RBAC 动态 url 认证 @@ -86,7 +92,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // 登出行为由自己实现,参考 AuthController#logout .and() - .logout().disable() + .logout() + .disable() // Session 管理 .sessionManagement() @@ -101,4 +108,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // 添加自定义 JWT 过滤器 http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } + + @Override + public void configure(WebSecurity web) throws Exception { + if (CollUtil.isNotEmpty(customConfig.getIgnores())) { + web.ignoring() + .antMatchers(ArrayUtil.toArray(customConfig.getIgnores(), String.class)); + } + } } diff --git a/spring-boot-demo-rbac-security/src/main/resources/application.yml b/spring-boot-demo-rbac-security/src/main/resources/application.yml index 88264ee..00dd077 100644 --- a/spring-boot-demo-rbac-security/src/main/resources/application.yml +++ b/spring-boot-demo-rbac-security/src/main/resources/application.yml @@ -47,3 +47,8 @@ jwt: logging: level: com.xkcoding.rbac.security: debug +custom: + config: + ignores: + - "/api/auth/login" + - "/api/auth/logout" \ No newline at end of file