Skip to content

通用安全模块 集成 spring securit, spring cloud oauth 和 spring social,实现 用户名密码登录,手机验证码登录,社交账号(微信,QQ,微博)登录,基于jwt的sso,集群session管理等功能。

License

Notifications You must be signed in to change notification settings

721806280/healthy-security

Repository files navigation

Healthy-Security-OAuth2

介绍

通用安全模块 集成 spring securit、spring cloud oauth、spring social,实现用户名密码、手机验证码、社交(微信、QQ、微博)等常用登录方式、基于jwt的sso,集群session管理等功能。

软件依赖

依赖 版本
Spring Boot 2.7.8
Spring Cloud 2021.0.5
Spring Cloud Alibaba 2021.0.4.0
Spring Security OAuth2 2.3.6
HuTool 5.8.12

项目结构

名称 描述
healthy-app APP模块
healthy-browser 浏览器模块
healthy-core 核心模块
healthy-test 测试工程

依赖关系为: test依赖 browser和app,browser和app依赖core.

引入模块包名不同的情况下扫描问题

@SpringBootApplication(scanBasePackages={"com.example.demo","com.healthy.security"})

如何使用

1.引入依赖(pom.xml)

<dependency>
	<groupId>com.healthy.security</groupId>
	<artifactId>healthy-security-browser</artifactId>
	<version>${healthy.security.version}</version>
</dependency>

2.配置系统(参见 application-example.yml)

3.增加UserDetailsService接口实现

4.如果需要记住我功能

  • 检查:com.healthy.security.browser.BrowserSecurityConfig中是否初始化PersistentTokenRepository
@Bean
public PersistentTokenRepository persistentTokenRepository() {
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setDataSource(dataSource);
    //自动创建数据库表
    //tokenRepository.setCreateTableOnStartup(true);
    return tokenRepository;
}
  • 创建数据库表(参见:org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl源码)
create table persistent_logins (
	username varchar(64) not null,
	series varchar(64) primary key,
	token varchar(64) not null,
	last_used timestamp not null
);

5.如果需要社交登录功能,需要以下额外的步骤

  • 配置appId和appSecret
  • 创建并配置用户注册页面,并实现注册服务(需要配置访问权限),注意在服务中要调用ProviderSignInUtils(APP模块需调用AppSignInUtils)的doPostSignUp方法。
  • 添加SocialUserDetailsService接口实现(返回的是SocialUser)
  • 创建社交登录用的表 (参见 db.sql)
    -- 社交登录表文件来自: org.springframework.social.connect.jdbc包路径下的JdbcUsersConnectionRepository.sql
    -- 如果需要设置表前缀. 请配置: healthy.security.social.jdbc-table-prefix
    create table UserConnection (userId varchar(255) not null,
    	providerId varchar(255) not null,
    	providerUserId varchar(255),
    	rank int not null,
    	displayName varchar(255),
    	profileUrl varchar(512),
    	imageUrl varchar(512),
    	accessToken varchar(512) not null,
    	secret varchar(512),
    	refreshToken varchar(512),
    	expireTime bigint,
    	primary key (userId, providerId, providerUserId)
    );
    create unique index UserConnectionRank on UserConnection(userId, providerId, rank);
    
  • QQ互联网站回调域设置多个用";"隔开
    • /login/qq 为配置文件中的:/{healthy.security.social.filter-processes-url}/{healthy.security.social.qq.provider-id}
    • /connect/qq 为配置文件中的:/connect/{healthy.security.social.qq.provider-id}
    • QQ互联网站回调域参考设置:https://www.xxx.com/login/qq;https://www.xxx.com/connect/qq
  • 新浪微博回调域多个回调url的情况下需绑定安全域名
    • 官方提示:当用户授权你的应用后,开放平台会回调你填写的这个地址。如果应用绑定了域名,该域名下的回调页地址都有效。

可扩展项

向spring容器注册以下接口的实现,可以替换默认的处理逻辑

  • 密码加密解密策略 org.springframework.security.crypto.password.PasswordEncoder

  • 表单登录用户信息读取逻辑 org.springframework.security.core.userdetails.UserDetailsService

  • 社交登录用户信息读取逻辑 org.springframework.social.security.SocialUserDetailsService

  • Session失效时的处理策略 org.springframework.security.web.session.InvalidSessionStrategy

  • 并发登录导致前一个session失效时的处理策略配置 org.springframework.security.web.session.SessionInformationExpiredStrategy

  • 退出时的处理逻辑 org.springframework.security.web.authentication.logout.LogoutSuccessHandler

  • 短信发送的处理逻辑 com.healthy.security.core.validate.code.sms.SmsCodeSender

  • 向spring容器注册名为imageValidateCodeGenerator的bean,可以替换默认的图片验证码生成逻辑,bean必须实现以下接口 com.healthy.security.core.validate.code.ValidateCodeGenerator

  • 如果spring容器中有下面这个接口的实现,则在社交登录无法确认用户时,用此接口的实现自动注册用户,不会跳到注册页面 org.springframework.social.connect.ConnectionSignUp

About

通用安全模块 集成 spring securit, spring cloud oauth 和 spring social,实现 用户名密码登录,手机验证码登录,社交账号(微信,QQ,微博)登录,基于jwt的sso,集群session管理等功能。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published