分享

spring security oauth2 自定义实现令牌存储

 江江385 2013-05-08

我一开始用oauth2 for spring security的JdbcTokenStore存储令牌,它用jdbcTemplate操作数据库,代码显示操作成功,但是数据库里就是没有存储的令牌,调试搞了一天,就是找不到原因,无奈,只好自己用mybatis实现了一个tokenStore。

数据库表结构:

  1. drop table if exists oauth_client_details;  
  2. drop table if exists oauth_access_token;  
  3. drop table if exists oauth_refresh_token;  
  4. drop table if exists oauth_code;  
  5.   
  6. create table oauth_client_details (  
  7.   client_id VARCHAR(50) PRIMARY KEY,  
  8.   resource_ids VARCHAR(256),  
  9.   client_secret VARCHAR(256),  
  10.   scope VARCHAR(256),  
  11.   authorized_grant_types VARCHAR(256),  
  12.   web_server_redirect_uri VARCHAR(256),  
  13.   authorities VARCHAR(256)  
  14. );  
  15.   
  16. create table oauth_access_token (  
  17.   token_id VARCHAR(256),  
  18.   token blob,  
  19.   authentication_id VARCHAR(256),  
  20.   authentication blob,  
  21.   refresh_token VARCHAR(256)  
  22. );  
  23.   
  24. create table oauth_refresh_token (  
  25.   token_id VARCHAR(256),  
  26.   token blob,  
  27.   authentication blob  
  28. );  
  29.   
  30. create table oauth_code (  
  31.   code VARCHAR(256),  
  32.   authentication blob  
  33. );  
  34.   
  35. insert into oauth_client_details(client_id,resource_ids,client_secret,scope,authorized_grant_types,authorities)   
  36. values('client','sparklr','secret','read,write','authorization_code','ROLE_CLIENT');  



几个实体类如下:

  1. package com.hxp.oauth.server.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class MybatisOauth2AccessToken implements Serializable {  
  6.     private static final long serialVersionUID = -4232065232755289541L;  
  7.   
  8.     private String tokenId;  
  9.     private byte[] token;  
  10.     private String authenticationId;  
  11.     private byte[] authentication;  
  12.     private String refreshToken;  
  13.   
  14.     public String getTokenId() {  
  15.         return tokenId;  
  16.     }  
  17.   
  18.     public void setTokenId(String tokenId) {  
  19.         this.tokenId = tokenId;  
  20.     }  
  21.   
  22.     public byte[] getToken() {  
  23.         return token;  
  24.     }  
  25.   
  26.     public void setToken(byte[] token) {  
  27.         this.token = token;  
  28.     }  
  29.   
  30.     public String getAuthenticationId() {  
  31.         return authenticationId;  
  32.     }  
  33.   
  34.     public void setAuthenticationId(String authenticationId) {  
  35.         this.authenticationId = authenticationId;  
  36.     }  
  37.   
  38.     public byte[] getAuthentication() {  
  39.         return authentication;  
  40.     }  
  41.   
  42.     public void setAuthentication(byte[] authentication) {  
  43.         this.authentication = authentication;  
  44.     }  
  45.   
  46.     public String getRefreshToken() {  
  47.         return refreshToken;  
  48.     }  
  49.   
  50.     public void setRefreshToken(String refreshToken) {  
  51.         this.refreshToken = refreshToken;  
  52.     }  
  53.   
  54.       
  55.   
  56. }  

  1. package com.hxp.oauth.server.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class MybatisOauth2RefreshToken implements Serializable {  
  6.     private static final long serialVersionUID = 238497479380096784L;  
  7.   
  8.     private String tokenId;  
  9.     private byte[] token;  
  10.     private byte[] authentication;  
  11.   
  12.     public String getTokenId() {  
  13.         return tokenId;  
  14.     }  
  15.   
  16.     public void setTokenId(String tokenId) {  
  17.         this.tokenId = tokenId;  
  18.     }  
  19.   
  20.     public byte[] getToken() {  
  21.         return token;  
  22.     }  
  23.   
  24.     public void setToken(byte[] token) {  
  25.         this.token = token;  
  26.     }  
  27.   
  28.     public byte[] getAuthentication() {  
  29.         return authentication;  
  30.     }  
  31.   
  32.     public void setAuthentication(byte[] authentication) {  
  33.         this.authentication = authentication;  
  34.     }  
  35.   
  36. }  

  1. package com.hxp.oauth.server.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class MybatisOauth2Code implements Serializable {  
  6.     private static final long serialVersionUID = -1799776184263988216L;  
  7.   
  8.     private String code;  
  9.     private byte[] authentication;  
  10.   
  11.     public String getCode() {  
  12.         return code;  
  13.     }  
  14.   
  15.     public void setCode(String code) {  
  16.         this.code = code;  
  17.     }  
  18.   
  19.     public byte[] getAuthentication() {  
  20.         return authentication;  
  21.     }  
  22.   
  23.     public void setAuthentication(byte[] authentication) {  
  24.         this.authentication = authentication;  
  25.     }  
  26.   
  27. }  


tokenStore类:

  1. package com.hxp.oauth.server.store;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5. import org.springframework.dao.EmptyResultDataAccessException;  
  6. import org.springframework.security.oauth2.common.ExpiringOAuth2RefreshToken;  
  7. import org.springframework.security.oauth2.common.OAuth2AccessToken;  
  8. import org.springframework.security.oauth2.common.util.SerializationUtils;  
  9. import org.springframework.security.oauth2.provider.OAuth2Authentication;  
  10. import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator;  
  11. import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;  
  12. import org.springframework.security.oauth2.provider.token.TokenStore;  
  13.   
  14. import com.hxp.oauth.server.dao.MybatisTokenDao;  
  15. import com.hxp.oauth.server.entity.MybatisOauth2AccessToken;  
  16. import com.hxp.oauth.server.entity.MybatisOauth2RefreshToken;  
  17.   
  18. public class MybatisTokenStore implements TokenStore {  
  19.     private static final Log LOG = LogFactory.getLog(MybatisTokenStore.class);  
  20.       
  21.     private MybatisTokenDao mybatisTokenDao;  
  22.       
  23.     private AuthenticationKeyGenerator authenticationKeyGenerator = new DefaultAuthenticationKeyGenerator();  
  24.       
  25.       
  26.     public OAuth2Authentication readAuthentication(OAuth2AccessToken token) {  
  27.         OAuth2Authentication authentication = null;  
  28.   
  29.         try {  
  30.             MybatisOauth2AccessToken at=mybatisTokenDao.readAccessToken( token.getValue());  
  31.             authentication = SerializationUtils.deserialize(at.getAuthentication());  
  32.                       
  33.         }  
  34.         catch (EmptyResultDataAccessException e) {  
  35.             if (LOG.isInfoEnabled()) {  
  36.                 LOG.info("Failed to find access token for token " + token);  
  37.             }  
  38.         }  
  39.   
  40.         return authentication;  
  41.     }  
  42.   
  43.     public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) {  
  44.         String refreshToken = null;  
  45.         if (token.getRefreshToken() != null) {  
  46.             refreshToken = token.getRefreshToken().getValue();  
  47.         }  
  48.         MybatisOauth2AccessToken at=new MybatisOauth2AccessToken();  
  49.         at.setTokenId(token.getValue());  
  50.         at.setToken(SerializationUtils.serialize(token));  
  51.         at.setAuthenticationId(authenticationKeyGenerator.extractKey(authentication));  
  52.         at.setAuthentication(SerializationUtils.serialize(authentication));  
  53.         at.setRefreshToken(refreshToken);  
  54.         mybatisTokenDao.storeAccessToken(at);  
  55.     }  
  56.   
  57.     public OAuth2AccessToken readAccessToken(String tokenValue) {  
  58.         OAuth2AccessToken accessToken = null;  
  59.   
  60.         try {  
  61.             accessToken = SerializationUtils.deserialize(mybatisTokenDao.readAccessToken(tokenValue).getToken());             
  62.         }  
  63.         catch (EmptyResultDataAccessException e) {  
  64.             if (LOG.isInfoEnabled()) {  
  65.                 LOG.info("Failed to find access token for token " + tokenValue);  
  66.             }  
  67.         }  
  68.   
  69.         return accessToken;  
  70.     }  
  71.   
  72.     public void removeAccessToken(String tokenValue) {  
  73.         mybatisTokenDao.removeAccessToken(tokenValue);  
  74.   
  75.     }  
  76.   
  77.     public OAuth2Authentication readAuthentication(ExpiringOAuth2RefreshToken token) {  
  78.         OAuth2Authentication authentication = null;  
  79.   
  80.         try {  
  81.             authentication = SerializationUtils.deserialize(mybatisTokenDao.readRefreshToken(token.getValue()).getAuthentication());  
  82.         }  
  83.         catch (EmptyResultDataAccessException e) {  
  84.             if (LOG.isInfoEnabled()) {  
  85.                 LOG.info("Failed to find access token for token " + token);  
  86.             }  
  87.         }  
  88.   
  89.         return authentication;  
  90.     }  
  91.   
  92.     public void storeRefreshToken(ExpiringOAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {  
  93.         MybatisOauth2RefreshToken rt=new MybatisOauth2RefreshToken();  
  94.         rt.setTokenId(refreshToken.getValue());  
  95.         rt.setToken(SerializationUtils.serialize(refreshToken));  
  96.         rt.setAuthentication(SerializationUtils.serialize(authentication));  
  97.         mybatisTokenDao.storeRefreshToken(rt);  
  98.     }  
  99.   
  100.     public ExpiringOAuth2RefreshToken readRefreshToken(String tokenValue) {  
  101.         ExpiringOAuth2RefreshToken refreshToken = null;  
  102.   
  103.         try {  
  104.             refreshToken = SerializationUtils.deserialize(mybatisTokenDao.readRefreshToken(tokenValue).getToken());  
  105.         }  
  106.         catch (EmptyResultDataAccessException e) {  
  107.             if (LOG.isInfoEnabled()) {  
  108.                 LOG.info("Failed to find refresh token for token " + tokenValue);  
  109.             }  
  110.         }  
  111.   
  112.         return refreshToken;  
  113.     }  
  114.   
  115.     public void removeRefreshToken(String tokenValue) {  
  116.         mybatisTokenDao.removeRefreshToken(tokenValue);  
  117.   
  118.     }  
  119.   
  120.     public void removeAccessTokenUsingRefreshToken(String refreshToken) {  
  121.         mybatisTokenDao.removeAccessTokenUsingRefreshToken(refreshToken);  
  122.   
  123.     }  
  124.   
  125.     public OAuth2AccessToken getAccessToken(OAuth2Authentication authentication) {  
  126.         OAuth2AccessToken accessToken = null;  
  127.   
  128.         try {  
  129.             String auth=authenticationKeyGenerator.extractKey(authentication);  
  130.              MybatisOauth2AccessToken at=mybatisTokenDao.getAccessToken(auth);  
  131.             if(null==at){  
  132.                 return null;  
  133.             }else{  
  134.                 accessToken = SerializationUtils.deserialize(at.getToken());  
  135.             }  
  136.                   
  137.         }  
  138.         catch (EmptyResultDataAccessException e) {  
  139.             if (LOG.isInfoEnabled()) {  
  140.                 LOG.debug("Failed to find access token for authentication " + authentication);  
  141.             }  
  142.         }  
  143.   
  144.         return accessToken;  
  145.     }  
  146.   
  147.     public MybatisTokenDao getMybatisTokenDao() {  
  148.         return mybatisTokenDao;  
  149.     }  
  150.   
  151.     public void setMybatisTokenDao(MybatisTokenDao mybatisTokenDao) {  
  152.         this.mybatisTokenDao = mybatisTokenDao;  
  153.     }  
  154.       
  155.       
  156.   
  157. }  

dao接口类:

  1. package com.hxp.oauth.server.dao;  
  2.   
  3. import com.hxp.oauth.server.entity.MybatisOauth2AccessToken;  
  4. import com.hxp.oauth.server.entity.MybatisOauth2RefreshToken;  
  5.   
  6. public interface MybatisTokenDao {    
  7.     void storeAccessToken(MybatisOauth2AccessToken token);  
  8.       
  9.     MybatisOauth2AccessToken readAccessToken(String tokenValue);  
  10.   
  11.      void removeAccessToken(String tokenValue);  
  12.   
  13.      void storeRefreshToken(MybatisOauth2RefreshToken token);  
  14.   
  15.      MybatisOauth2RefreshToken readRefreshToken(String tokenValue);  
  16.   
  17.      void removeRefreshToken(String tokenValue);  
  18.   
  19.      void removeAccessTokenUsingRefreshToken(String refreshToken);  
  20.   
  21.      MybatisOauth2AccessToken getAccessToken(String authentication);  
  22. }  

mapper 配置文件:

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN"   
  3. "http:///dtd/mybatis-3-mapper.dtd">  
  4.   
  5. <mapper namespace="com.hxp.oauth.server.dao.MybatisTokenDao">  
  6.     <resultMap id="accessToken" type="com.hxp.oauth.server.entity.MybatisOauth2AccessToken">  
  7.         <result property="tokenId" column="token_id" />  
  8.         <result property="token" column="token" />  
  9.         <result property="authenticationId" column="authentication_id" />  
  10.         <result property="authentication" column="authentication" />  
  11.         <result property="refreshToken" column="refresh_token" />  
  12.     </resultMap>  
  13.     <resultMap id="refreshToken" type="com.hxp.oauth.server.entity.MybatisOauth2RefreshToken">  
  14.         <result property="tokenId" column="token_id" />  
  15.         <result property="token" column="token" />  
  16.         <result property="authentication" column="authentication" />  
  17.     </resultMap>  
  18.     <resultMap id="code" type="com.hxp.oauth.server.entity.MybatisOauth2Code">  
  19.         <result property="code" column="code" />  
  20.         <result property="authentication" column="authentication" />  
  21.     </resultMap>  
  22.       
  23.       
  24.     <insert id="storeAccessToken" parameterType="com.hxp.oauth.server.entity.MybatisOauth2AccessToken">  
  25.         insert into oauth_access_token (token_id, token, authentication_id, authentication, refresh_token) values (#{tokenId}, #{token ,javaType=byte[], jdbcType=BLOB,typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{authenticationId}, #{authentication ,javaType=byte[], jdbcType=BLOB,typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{refreshToken})  
  26.     </insert>  
  27.       
  28.     <select id="readAccessToken" parameterType="string"  resultMap="accessToken">  
  29.             select token_id, token,authentication from oauth_access_token where token_id = #{tokenValue}  
  30.     </select>  
  31.       
  32.     <delete id="removeAccessToken" parameterType="string" >  
  33.         delete from oauth_access_token where token_id = #{tokenValue}  
  34.     </delete>  
  35.   
  36.     <insert id="storeRefreshToken" parameterType="com.hxp.oauth.server.entity.MybatisOauth2RefreshToken" >  
  37.         insert into oauth_refresh_token (token_id, token, authentication) values (#{tokenId}, #{token ,javaType=byte[], jdbcType=BLOB,typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{authentication ,javaType=byte[], jdbcType=BLOB,typeHandler=org.apache.ibatis.type.BlobTypeHandler})  
  38.     </insert>  
  39.       
  40.     <select id="readRefreshToken" parameterType="string" resultMap="refreshToken" >  
  41.         select token_id, token,authentication from oauth_refresh_token where token_id = #{tokenValue}  
  42.     </select>  
  43.       
  44.     <delete id="removeRefreshToken" parameterType="string" >  
  45.         delete from oauth_refresh_token where token_id = #{tokenValue}  
  46.     </delete>  
  47.       
  48.     <delete id="removeAccessTokenUsingRefreshToken" parameterType="string" >  
  49.         delete from oauth_access_token where refresh_token = #{tokenValue}  
  50.     </delete>  
  51.       
  52.     <select id="getAccessToken" parameterType="string" resultMap="accessToken">  
  53.         select token_id, token from oauth_access_token where authentication_id = #{authentication}  
  54.     </select>  
  55. </mapper>  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多