Skip to content

Commit 4b92538

Browse files
committed
♻️ 业务模块使用 ballcat 提供的安全权限注解,方便与 spring security 解耦
link ballcat-projects/ballcat#205
1 parent ca35b7d commit 4b92538

File tree

48 files changed

+408
-235
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+408
-235
lines changed

ballcat-admin/ballcat-admin-core/pom.xml

+19-15
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
<artifactId>ballcat-admin-core</artifactId>
1111

1212
<dependencies>
13-
<!--mybatis plus-->
1413
<dependency>
15-
<groupId>com.baomidou</groupId>
16-
<artifactId>mybatis-plus-boot-starter</artifactId>
14+
<groupId>org.ballcat</groupId>
15+
<artifactId>ballcat-spring-boot-starter-web</artifactId>
1716
</dependency>
1817
<!-- 脱敏工具 -->
1918
<dependency>
@@ -37,23 +36,15 @@
3736
<groupId>org.ballcat</groupId>
3837
<artifactId>ballcat-spring-boot-starter-redis</artifactId>
3938
</dependency>
40-
<dependency>
41-
<groupId>org.ballcat</groupId>
42-
<artifactId>ballcat-spring-boot-starter-web</artifactId>
43-
</dependency>
4439
<dependency>
4540
<groupId>org.ballcat</groupId>
4641
<artifactId>ballcat-spring-boot-starter-xss</artifactId>
4742
</dependency>
48-
<!-- 基于 spring authorization server 的授权服务器 -->
49-
<dependency>
50-
<groupId>org.ballcat</groupId>
51-
<artifactId>ballcat-spring-security-oauth2-authorization-server</artifactId>
52-
<scope>provided</scope>
53-
</dependency>
43+
44+
<!--mybatis plus-->
5445
<dependency>
55-
<groupId>org.ballcat</groupId>
56-
<artifactId>ballcat-spring-security-oauth2-resource-server</artifactId>
46+
<groupId>com.baomidou</groupId>
47+
<artifactId>mybatis-plus-boot-starter</artifactId>
5748
</dependency>
5849

5950
<!-- 业务模块 -->
@@ -73,5 +64,18 @@
7364
<groupId>org.ballcat.business</groupId>
7465
<artifactId>ballcat-system-controller</artifactId>
7566
</dependency>
67+
68+
<!-- 基于 spring authorization server 的授权服务器 -->
69+
<dependency>
70+
<groupId>org.ballcat</groupId>
71+
<artifactId>ballcat-spring-security-oauth2-authorization-server</artifactId>
72+
<scope>provided</scope>
73+
</dependency>
74+
<!-- 基于 spring security 的资源服务器 -->
75+
<dependency>
76+
<groupId>org.ballcat</groupId>
77+
<artifactId>ballcat-spring-security-oauth2-resource-server</artifactId>
78+
<scope>provided</scope>
79+
</dependency>
7680
</dependencies>
7781
</project>
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package org.ballcat.business.system.authentication;
1+
package org.ballcat.admin.springsecurity;
22

3+
import org.ballcat.admin.springsecurity.UserInfoCoordinator;
34
import org.ballcat.business.system.model.dto.UserInfoDTO;
45

56
import java.util.Map;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.ballcat.admin.springsecurity;
2+
3+
import org.ballcat.business.system.component.AbstractPasswordHelper;
4+
import org.ballcat.business.system.properties.SystemProperties;
5+
import org.ballcat.security.properties.SecurityProperties;
6+
import org.springframework.security.crypto.password.PasswordEncoder;
7+
8+
/**
9+
* 基于 SpringSecurity 的密码工具类
10+
*
11+
* @author Hccake
12+
* @since 2.0.0
13+
*/
14+
public class SpringSecurityPasswordHelper extends AbstractPasswordHelper {
15+
16+
private final PasswordEncoder passwordEncoder;
17+
18+
public SpringSecurityPasswordHelper(SecurityProperties securityProperties, SystemProperties systemProperties,
19+
PasswordEncoder passwordEncoder) {
20+
super(securityProperties, systemProperties);
21+
this.passwordEncoder = passwordEncoder;
22+
}
23+
24+
@Override
25+
public String encode(String rawPassword) {
26+
return passwordEncoder.encode(rawPassword);
27+
}
28+
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.ballcat.admin.springsecurity;
2+
3+
import org.ballcat.security.core.PrincipalAttributeAccessor;
4+
import org.ballcat.springsecurity.oauth2.userdetails.User;
5+
import org.springframework.security.core.Authentication;
6+
import org.springframework.security.core.context.SecurityContextHolder;
7+
8+
public class SpringSecurityPrincipalAttributeAccessor implements PrincipalAttributeAccessor {
9+
10+
@Override
11+
@SuppressWarnings("unchecked")
12+
public <A> A getAttribute(String name) {
13+
User user = getUser();
14+
if (user != null) {
15+
return (A) user.getAttributes().get(name);
16+
}
17+
return null;
18+
}
19+
20+
@Override
21+
@SuppressWarnings("unchecked")
22+
public Long getUserId() {
23+
User user = getUser();
24+
if (user != null) {
25+
return user.getUserId();
26+
}
27+
return null;
28+
}
29+
30+
@Override
31+
public String getName() {
32+
User user = getUser();
33+
if (user != null) {
34+
return user.getUsername();
35+
}
36+
return null;
37+
}
38+
39+
private static Authentication getAuthentication() {
40+
return SecurityContextHolder.getContext().getAuthentication();
41+
}
42+
43+
private static User getUser() {
44+
Authentication authentication = getAuthentication();
45+
if (authentication == null) {
46+
return null;
47+
}
48+
Object principal = authentication.getPrincipal();
49+
if (principal instanceof User) {
50+
return (User) principal;
51+
}
52+
else {
53+
return null;
54+
}
55+
}
56+
57+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.ballcat.business.system.authentication;
1+
package org.ballcat.admin.springsecurity;
22

33
import org.ballcat.springsecurity.oauth2.constant.UserAttributeNameConstants;
44
import org.ballcat.springsecurity.oauth2.userdetails.User;
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.ballcat.business.system.authentication;
1+
package org.ballcat.admin.springsecurity;
22

33
import org.ballcat.business.system.model.dto.UserInfoDTO;
44

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.ballcat.business.notify.listener;
1+
package org.ballcat.admin.springsecurity.login;
22

33
import org.ballcat.business.notify.enums.NotifyChannelEnum;
44
import org.ballcat.business.notify.model.entity.Announcement;
@@ -13,7 +13,6 @@
1313
import org.springframework.context.event.EventListener;
1414
import org.springframework.security.authentication.AbstractAuthenticationToken;
1515
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
16-
import org.springframework.stereotype.Component;
1716

1817
import java.util.HashMap;
1918
import java.util.List;
@@ -25,7 +24,6 @@
2524
* @version 1.0
2625
*/
2726
@Slf4j
28-
@Component
2927
@RequiredArgsConstructor
3028
public class AnnouncementLoginEventListener {
3129

@@ -36,11 +34,11 @@ public class AnnouncementLoginEventListener {
3634
private final UserAnnouncementService userAnnouncementService;
3735

3836
/**
39-
* 登录成功时间监听 用户未读公告生成
37+
* 登录成功时监听 用户未读公告生成
4038
* @param event 登录成功 event
4139
*/
4240
@EventListener(AuthenticationSuccessEvent.class)
43-
public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) throws InterruptedException {
41+
public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) {
4442

4543
AbstractAuthenticationToken source = (AbstractAuthenticationToken) event.getSource();
4644
Object details = source.getDetails();
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.ballcat.business.system.authentication;
1+
package org.ballcat.admin.springsecurity.oauth2;
22

33
import org.ballcat.springsecurity.oauth2.constant.TokenAttributeNameConstants;
44
import org.ballcat.springsecurity.oauth2.constant.UserAttributeNameConstants;

ballcat-admin/ballcat-admin-core/src/main/java/org/ballcat/admin/upms/UpmsAutoConfiguration.java

+19-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.ballcat.admin.upms;
22

3+
import org.ballcat.admin.springsecurity.*;
4+
import org.ballcat.admin.springsecurity.oauth2.BallcatOAuth2TokenResponseEnhancer;
35
import org.ballcat.admin.upms.log.LogConfiguration;
4-
import org.ballcat.business.system.authentication.BallcatOAuth2TokenResponseEnhancer;
5-
import org.ballcat.business.system.authentication.DefaultUserInfoCoordinatorImpl;
6-
import org.ballcat.business.system.authentication.SysUserDetailsServiceImpl;
7-
import org.ballcat.business.system.authentication.UserInfoCoordinator;
6+
import org.ballcat.business.system.component.PasswordHelper;
87
import org.ballcat.business.system.properties.SystemProperties;
98
import org.ballcat.business.system.service.SysUserService;
9+
import org.ballcat.security.core.PrincipalAttributeAccessor;
1010
import org.ballcat.security.properties.SecurityProperties;
1111
import org.ballcat.springsecurity.oauth2.server.authorization.web.authentication.OAuth2TokenResponseEnhancer;
1212
import org.ballcat.springsecurity.oauth2.server.resource.introspection.SpringAuthorizationServerSharedStoredOpaqueTokenIntrospector;
@@ -22,6 +22,7 @@
2222
import org.springframework.context.annotation.Import;
2323
import org.springframework.scheduling.annotation.EnableAsync;
2424
import org.springframework.security.core.userdetails.UserDetailsService;
25+
import org.springframework.security.crypto.password.PasswordEncoder;
2526
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
2627
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
2728
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
@@ -44,7 +45,7 @@ public class UpmsAutoConfiguration {
4445
* @author hccake
4546
*/
4647
@Configuration(proxyBeanMethods = false)
47-
@ConditionalOnClass(SysUserService.class)
48+
@ConditionalOnClass({ UserDetailsService.class, SysUserService.class })
4849
@ConditionalOnMissingBean(UserDetailsService.class)
4950
static class UserDetailsServiceConfiguration {
5051

@@ -69,6 +70,19 @@ public UserInfoCoordinator userInfoCoordinator() {
6970
return new DefaultUserInfoCoordinatorImpl();
7071
}
7172

73+
@Bean
74+
@ConditionalOnMissingBean
75+
public PasswordHelper passwordHelper(SecurityProperties securityProperties, SystemProperties systemProperties,
76+
PasswordEncoder passwordEncoder) {
77+
return new SpringSecurityPasswordHelper(securityProperties, systemProperties, passwordEncoder);
78+
}
79+
80+
@Bean
81+
@ConditionalOnMissingBean
82+
public PrincipalAttributeAccessor principalAttributeAccessor() {
83+
return new SpringSecurityPrincipalAttributeAccessor();
84+
}
85+
7286
}
7387

7488
/**

ballcat-admin/ballcat-admin-core/src/main/java/org/ballcat/admin/upms/config/mybatis/FillMetaObjectHandle.java

+14-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package org.ballcat.admin.upms.config.mybatis;
22

33
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
4-
import org.ballcat.common.core.constant.GlobalConstants;
5-
import org.ballcat.springsecurity.oauth2.userdetails.User;
6-
import org.ballcat.springsecurity.util.SecurityUtils;
74
import lombok.extern.slf4j.Slf4j;
85
import org.apache.ibatis.reflection.MetaObject;
6+
import org.ballcat.common.core.constant.GlobalConstants;
7+
import org.ballcat.security.core.PrincipalAttributeAccessor;
98

109
import java.time.LocalDateTime;
1110

@@ -15,16 +14,22 @@
1514
@Slf4j
1615
public class FillMetaObjectHandle implements MetaObjectHandler {
1716

17+
private final PrincipalAttributeAccessor principalAttributeAccessor;
18+
19+
public FillMetaObjectHandle(PrincipalAttributeAccessor principalAttributeAccessor) {
20+
this.principalAttributeAccessor = principalAttributeAccessor;
21+
}
22+
1823
@Override
1924
public void insertFill(MetaObject metaObject) {
2025
// 逻辑删除标识
2126
this.strictInsertFill(metaObject, "deleted", Long.class, GlobalConstants.NOT_DELETED_FLAG);
2227
// 创建时间
2328
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
2429
// 创建人
25-
User user = SecurityUtils.getUser();
26-
if (user != null) {
27-
this.strictInsertFill(metaObject, "createBy", Long.class, user.getUserId());
30+
Long userId = principalAttributeAccessor.getUserId();
31+
if (userId != null) {
32+
this.strictInsertFill(metaObject, "createBy", Long.class, userId);
2833
}
2934
}
3035

@@ -33,9 +38,9 @@ public void updateFill(MetaObject metaObject) {
3338
// 修改时间
3439
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
3540
// 修改人
36-
User user = SecurityUtils.getUser();
37-
if (user != null) {
38-
this.strictUpdateFill(metaObject, "updateBy", Long.class, user.getUserId());
41+
Long userId = principalAttributeAccessor.getUserId();
42+
if (userId != null) {
43+
this.strictUpdateFill(metaObject, "updateBy", Long.class, userId);
3944
}
4045
}
4146

ballcat-admin/ballcat-admin-core/src/main/java/org/ballcat/admin/upms/config/mybatis/MybatisPlusConfig.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
1010
import org.ballcat.mybatisplus.injector.CustomSqlInjector;
1111
import org.ballcat.mybatisplus.methods.InsertBatchSomeColumnByCollection;
12+
import org.ballcat.security.core.PrincipalAttributeAccessor;
1213
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1314
import org.springframework.context.annotation.Bean;
1415
import org.springframework.context.annotation.Configuration;
@@ -17,8 +18,9 @@
1718
import java.util.List;
1819

1920
/**
20-
* @author hccake
21-
* @date 2020/04/19 默认配置MybatisPlus分页插件,通过conditional注解达到覆盖效用
21+
* 默认配置MybatisPlus分页插件,通过conditional注解达到覆盖效用
22+
*
23+
* @author hccake 2020/04/19
2224
*/
2325
@Configuration
2426
public class MybatisPlusConfig {
@@ -42,8 +44,8 @@ public MybatisPlusInterceptor mybatisPlusInterceptor() {
4244
*/
4345
@Bean
4446
@ConditionalOnMissingBean(MetaObjectHandler.class)
45-
public MetaObjectHandler fillMetaObjectHandle() {
46-
return new FillMetaObjectHandle();
47+
public MetaObjectHandler fillMetaObjectHandle(PrincipalAttributeAccessor principalAttributeAccessor) {
48+
return new FillMetaObjectHandle(principalAttributeAccessor);
4749
}
4850

4951
/**

ballcat-admin/ballcat-admin-core/src/main/java/org/ballcat/admin/upms/log/LogConfiguration.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.ballcat.business.log.service.LoginLogService;
1111
import org.ballcat.business.log.service.OperationLogService;
1212
import org.ballcat.business.log.thread.AccessLogSaveThread;
13+
import org.ballcat.security.core.PrincipalAttributeAccessor;
1314
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
1415
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1516
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -25,6 +26,12 @@
2526
@ConditionalOnClass(LoginLogService.class)
2627
public class LogConfiguration {
2728

29+
private final PrincipalAttributeAccessor principalAttributeAccessor;
30+
31+
public LogConfiguration(PrincipalAttributeAccessor principalAttributeAccessor) {
32+
this.principalAttributeAccessor = principalAttributeAccessor;
33+
}
34+
2835
/**
2936
* 访问日志保存
3037
* @param accessLogService 访问日志Service
@@ -34,7 +41,7 @@ public class LogConfiguration {
3441
@ConditionalOnBean(AccessLogService.class)
3542
@ConditionalOnMissingBean(AccessLogHandler.class)
3643
public AccessLogHandler<AccessLog> customAccessLogHandler(AccessLogService accessLogService) {
37-
return new CustomAccessLogHandler(new AccessLogSaveThread(accessLogService));
44+
return new CustomAccessLogHandler(new AccessLogSaveThread(accessLogService), principalAttributeAccessor);
3845
}
3946

4047
/**
@@ -46,7 +53,7 @@ public AccessLogHandler<AccessLog> customAccessLogHandler(AccessLogService acces
4653
@ConditionalOnBean(OperationLogService.class)
4754
@ConditionalOnMissingBean(OperationLogHandler.class)
4855
public OperationLogHandler<OperationLog> customOperationLogHandler(OperationLogService operationLogService) {
49-
return new CustomOperationLogHandler(operationLogService);
56+
return new CustomOperationLogHandler(operationLogService, principalAttributeAccessor);
5057
}
5158

5259
@ConditionalOnClass(OAuth2AuthorizationServerConfigurer.class)

0 commit comments

Comments
 (0)