说在前面
博主最近会有很多项目跟大家一起分享,做完后会上传github上的,希望读友们能给博主提提意见哈哈
这个项目是第三方登录和安全方面的,关于后台与app和网站的登录连接操作的实战项目
微信开发
开发流程
第一模块:微信API
1.Weixin接口,与QQ不同加入了一个accessToken参数
2.WeixinImpl接口实现类,继承AbstractOAuth2ApiBinding
- URL_GET_USER_INFO:获取用户信息的url
- 实现获取微信用户信息的方法
- 重写getMessageConverters方法,因为默认注册的StringHttpMessageConverter字符集为ISO-8859-1,而微信返回的是UTF-8的
3.WeixinUserInfo微信用户信息类,上微信开放平台查看属性即可
第二模块:connect
1.微信的access_token信息与标准的OAuth2协议不同,微信在获取access_token时会同时返回openId,并没有单独的通过accessToken换取openId的服务所以这里继承了标准AccessGrant,添加了openId字段,作为对微信access_token信息的封装,所以定义了一个WeixinAccessGrant微信认证权限类
2.写WeixinOAuth2Template微信关于OAuth2协议的模板
这里就不说具体了,我的代码里面都解释的非常清楚
3.开发微信适配器WeixinAdapter实现接口ApiAdapter
4.开发微信的OAuth2流程处理器的提供器,供Spring Social的connect体系调用:WeixinServiceProvider
5.开发WeixinConnectionFactory继承OAuth2ConnectionFactory
第三模块:config
1.WeixinAutoConfiguration继承SocialAutoConfigurerAdapter,加上
@Configuration
@ConditionalOnProperty(prefix = "tihom.security.social.weixin",name = "app-id")
2.WeixinProperties继承Spring的SocialProperties,在浏览器的包下配置
3.application下配置
#wxd99431bbff8305a0
tihom.security.social.weixin.app-id =
#60f78681d063590a469f1b297feff3c4
tihom.security.social.weixin.app-secret =
tihom.security.social.weixin.providerId=weixin
4.去html界面加上跳转即可
绑定与解绑
所谓绑定就是从数据库里面删除数据
1.Spring Social只提供数据没有提供视图
2.绑定时先跳转connect/status,我们要自己写这个视图
3.在social下定义一个TiHomConnectionStatusView类继承AbstractView,类中对视图进行渲染,同时这是个组件,要加上@Component(“connect/status”)
4.扫码绑定时,会跳转到connected视图,但是Spring Social默认没有实现,所以需要我们自己去写一个TiHomConnectView类继承AbstractView
5.开发解除绑定,可以把解绑的视图与绑定的视图写在一起,做个if判断来返回不同的视图信息
Session管理
Session超时处理
- 如何控制超时时间
- 设置超时时间
- 超时了以后如何处理
- 那就跳转session失效界面
Session并发控制
- a.新session把旧session踢下去,类似游戏中的挤下线
- b.新session无法踢下旧session,已经登录了就不能再另外登录了
重构代码,把url做成可配置、把返回做成json和html均兼容
- 将超时和并发处理各自抽成类进行处理
- 定义抽象的会话策略AbstractSessionStrategy
- TiHomExpiredSessionStrategy和TiHomInvalidSessionStrategy继承AbstractSessionStrategy并实现各自的处理接口
- 把配置都配置到常量接口和自定义session配置类
集群Session管理
- 引入spring session包,已经帮我们完成了session的问题,我们只需要配置采用的存储是什么和端口即可
- 使用redis做存储,为什么用redis?
- session访问频繁,存数据库的话在过滤器链进行过程中读取压力大
- session有时效性,存数据库还要自己处理清理,redis可以设置超时清理
退出处理
- 如何退出登录
- 调用/logout服务,跳转到/authentication/require?logout上
- Spring Security默认的退出处理逻辑
- 使当前session失效
- 清除与当前用户相关的remember-me记录
- 清空当前的SecurityContext
- 重定向到登录页
- 与退出登录相关的配置
- 自定义退出成功处理器TiHomLogoutSuccessHandler实现LogoutSuccessHandler接口,在onLogoutSuccess方法中实现自己的退出逻辑
- 到BrowserSecurityConfig中的configure中配置
.logout()
.logoutUrl("/signOut")
//.logoutSuccessUrl("/tihom-logout.html") //配了Handler就不能配Url,两者互斥
.logoutSuccessHandler(logoutSuccessHandler) //退出成功的处理
.deleteCookies("JSESSIONID") //自定义要删除的cookie
.and()
- demo中加demo-logout.html,到appication.properties中配置
tihom.security.browser.signOutUrl=/demo-logout.html