spring-oauth-server 如何扩展使用其他数据存储方式

spring-oauth-server项目默认提供了MYSQL数据库进行数据存储, 另一个branch: mongodb 使用了MongoDB进行数据存储.

但如果你想在使用时用其他的数据存储方式(如ORACLE,SQL SERVER, REDIS),该如何办呢? 以下给出一些思路, 希望能帮上你.

理论准备:

spring-oauth-server项目实际是一个基于Spring框架的, 而Spring的核心思想是什么——面向接口编程, 而面向接口编程带来的好处就是扩展性很强(不是一般的强), 以此为出发点来思考.

同时想想默认的spring-oauth-server使用MYSQL时有哪些数据进行了存储, 就寻找这些存储相关的类进行扩展.

具体实现:

(以mongodb 分支为例)

1.扩展接口TokenStore.java, 写自己的TokenStore实现类, 参见MongoTokenStore.java类. 同时在security.xml中配置tokenStore时使用自己扩展的类,如下图:

tokenStore

2.扩展接口ClientDetailsService.java,写自己的ClientDetailsService实现类, 参见MongoClientDetailsService.java类,同时在security.mxl中配置clientDetailsService时使用自己扩展的类,如下图:

clientDetailsService

3.扩展接口AuthorizationCodeServices.java,写自己的AuthorizationCodeServices实现类, 参见MongoAuthorizationCodeServices.java类,同时在security.xml中配置authorizationCodeServices时使用自己扩展的类,如下图:

authCode

 

OK, 在实现上面3个步骤后, 扩展实现数据存储方式就差不多了(当然,写一些辅助类是不错的,如MongoTokenStore实现时注入使用了AccessTokenRepository; 这能带来代码结构清晰,维护方便 ,扩展性强等好处), 以上的3个接口都有些抽象的或默认的实现类,如TokenStore默认时使用的实现类为InMemoryTokenStore.java, 借助强大的IDE工具去查看各个接口已有的实现类, 仿照或参考去扩展实现自己需要的实现类并配置即可, 比如可以继承一些已有的实现类进行覆盖扩展也是不错的主意.

 

编程之艺在于融会贯通,周而复始; 在于一种思想思考—面向期望编程!!!

 

spring-oauth-server 0.6 发布,OAuth2 与 Spring Security 安全应用整合

spring-oauth-server 0.6版本发布,该版本主要增加有缓存的支持, 具体的功能更新如下:

  • (150) – 修改OAUTH错误时返回JSON数据
  • (151) – 数据添加Ehcache缓存支持
  • (158) – 对配置,代码必要的地方添加注释,方便理解
  • 添加OIDC协议文档

OIDC是基于OAuth2的下一代身份认证授权协议,在0.6版本中添加了对OIDC1.0版本协议文档,同时在进行中文的翻译,具体请访问 https://andaily.com/blog/?p=440

spring-oauth-server 是一个整合OAuth2与Spring Security的安全应用项目,是从https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2扩展的符合实际项目需要的开源项目,可扩展为移动SSO解决方案.

0.6版本访问地址: http://git.oschina.net/shengzhao/spring-oauth-server/tree/0.6/

 

正确处理spring-oauth-server中在验证失败或错误时的方式

在文章 https://andaily.com/blog/?p=97 中提到了OAUTH验证失败或错误时的处理办法, 但该方式是不完美的.

通过剖析代码发现,为什么在浏览器中会返回XML格式的数据, 而在使用类似HttpClient的请求时返回的数据格式为JSON,

其实所有的根源都在于请求header中的Accept的值所决定的,如果Accept不支持application/json, 那服务端肯定不会返回JSON格式的数据,

通过浏览器的开发者工具很容易追踪,如下图:

web_response_xml

 

从图中可以看出我们在请求时header中Accept的值为:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8; 服务器响应401

没有json格式的 media type, 但有xml的, 所以返回的数据格式不会是JSON的在浏览器请求时, 同时请注意 response header中的WWW-Authenticate.

 

相同的请求,如果我们换一种方式, 如Postman, 其结果返回的却是JSON格式的.如下图:

postman_response_json1

 

这也是因为请求时的header中Accept导致的, 看下图:

postman_response_json2

 

Postman在请求时的Header中设置了Content-Type: application/json; 同时也注意WWW-Authenticate.

 

综上分析, 你应该知道如何在请求时设定响应时的数据格式了吧. 方法如下:

1. 如果能指定Header中的Accept或Content-Type, 则指定为具体的数据类型或 media type  (一般用在非浏览器环境)

2.不管返回的数据体(response body)是XML还是JSON, 通过响应的header来处理, 如果响应码不是200, 则获取Header中WWW-Authenticate的值.

通过解析WWW-Authenticate的值来获取错误信息 (适用几乎所有环境)

 

 

http://git.oschina.net/shengzhao/spring-oauth-server

spring-oauth-server 0.4-beta 发布, Oauth2 与 Spring Security 安全应用整合

spring-oauth-server 0.4-beta版本发布, spring-oauth-server 是一个整合Oauth2与Spring Security的安全应用项目,是从https://github.com/spring-projects/spring-security-oauth/tree/master/spring-security-oauth2扩展的符合实际项目需要的开源项目.

 

0.4-beta版本有重大的更新, 主要在更新了依赖的各类版本, 更新的内容如下:

  • (109) – 升级 spring-security-oauth2 的版本到2.0.7.RELEASE, 旧版本为1.0.5
  • (113) – Upgrade spring, spring security version to > 4.0; 具体版本为Spring: 4.1.6.RELEASE, Spring Security: 4.0.1.RELEASE
  • Upgrade JAVA JDK to 1.8; Servlet 3.0
  • 将项目添加到在线测试服务器, 地址为:https://andaily.com/spring-oauth-server/
  • (115) – Sync update spring-oauth-client version with spring-oauth-server
  • (116) – Remove mybatis dependency, only JDBC
  • Oauth database table add index
  • (97) – Fix custom access_token_validity,refresh_token_validity issue(#5)

 

0.4-beta版本访问地址: http://git.oschina.net/shengzhao/spring-oauth-server/tree/0.4-beta/

 

spring-oauth-server HomePage: http://git.oschina.net/shengzhao/spring-oauth-server

spring-oauth-server 数据扩展实现思路

spring-oauth-server 默认使用数据库MySql实现数据存储, 使用MyBatis, JDBC实现数据库连接与处理.

但在实际项目使用过程中, 有的项目需要使用其他的数据存储解决方案, 如 LDAP, 文件, ACCESS, REDIS, MongoDB等等. 这时如何办, 如何去扩展呢? 在此给一些步骤与建议.具体如下

 

1. 在项目中加入必要的MAVEN dependencies; 如 redis的, LDAP的.(建议使用基于spring-data 系列的, 方便与Spring 整合);  并去掉不需要的dependencies, (如当前的 mybatis, mysql);

2. 用你需要的存储技术 实现spring-security-oauth2提供的以下3个接口:

  • AuthorizationCodeServices
  • TokenStore
  • ClientDetailsService

3.修改security.xml中的对应的3个接口的默认配置, 分别为 JdbcTokenStore, CustomJdbcClientDetailsService, JdbcAuthorizationCodeServices;  用自己实现的替换默认的.

4.测试修改. 保证oauth_test.txt(位于others目录)中的示例能够正常运行, 或使用spring-oauth-client测试

 

扩展

若需要完全替换掉MYSQL, 则还需要提供 OauthRepository 与 UserRepository 的实现并配置.

 

——————————————————————————

若需要提供商业化的技术支持 或 提供整套的技术方案, 请联系 sz@monkeyk.com

 

http://git.oschina.net/shengzhao/spring-oauth-server