Shiro学习(17)OAuth2集成

目前很多开放平台如新浪微博开放平台都在使用提供开放API接口供开发者使用,随之带来了第三方应用要到开放平台进行授权的问题,OAuth就是干这个的,OAuth2是OAuth协议的下一个版本,相比OAuth1,OAuth2整个授权流程更简单安全了,但不兼容OAuth1,具体可以到OAuth2官网http://oauth.net/2/查看,OAuth2协议规范可以参考http://tools.ietf.org/html/rfc6749。目前有好多参考实现供选择,可以到其官网查看下载。

本文使用Apache Oltu,其之前的名字叫Apache Amber ,是Java版的参考实现。使用文档可参考https://cwiki.apache.org/confluence/display/OLTU/Documentation

OAuth角色
资源拥有者(resource owner):能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;如新浪微博用户zhangsan;
资源服务器(resource server):存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端;存储着用户zhangsan的微博等信息。
授权服务器(authorization server):成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。
客户端(client):如新浪微博客户端weico、微格等第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。“客户端”术语不代表任何特定实现(如应用运行在一台服务器、桌面、手机或其他设备)。

OAuth2协议流程

这里写图片描述
1、客户端从资源拥有者那请求授权。授权请求可以直接发给资源拥有者,或间接的通过授权服务器这种中介,后者更可取。
2、客户端收到一个授权许可,代表资源服务器提供的授权。
3、客户端使用它自己的私有证书及授权许可到授权服务器验证。
4、如果验证成功,则下发一个访问令牌。
5、客户端使用访问令牌向资源服务器请求受保护资源。
6、资源服务器会验证访问令牌的有效性,如果成功则下发受保护资源。

更多流程的解释请参考OAuth2的协议规范http://tools.ietf.org/html/rfc6749

服务器端
本文把授权服务器和资源服务器整合在一起实现。

POM依赖
此处我们使用apache oltu oauth2服务端实现,需要引入authzserver(授权服务器依赖)和resourceserver(资源服务器依赖)。
Java代码

<dependency>  
    <groupId>org.apache.oltu.oauth2</groupId>  
    <artifactId>org.apache.oltu.oauth2.authzserver</artifactId>  
    <version>0.31</version>  
</dependency>  
<dependency>  
    <groupId>org.apache.oltu.oauth2</groupId>  
    <artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>  
    <version>0.31</version>  
</dependency>   

其他的请参考pom.xml。

数据字典
用户(oauth2_user)
这里写图片描述
客户端(oauth2_client)
这里写图片描述

用户表存储着认证/资源服务器的用户信息,即资源拥有者;比如用户名/密码;客户端表存储客户端的的客户端id及客户端安全key;在进行授权时使用。

表及数据SQL
具体请参考
sql/ shiro-schema.sql (表结构)
sql/ shiro-data.sql (初始数据)

默认用户名/密码是admin/123456。

实体
具体请参考com.github.zhangkaitao.shiro.chapter17.entity包下的实体,此处就不列举了。

DAO
具体请参考com.github.zhangkaitao.shiro.chapter17.dao包下的DAO接口及实现。

Service
具体请参考com.github.zhangkaitao.shiro.chapter17.service包下的Service接口及实现。以下是出了基本CRUD之外的关键接口:
Java代码

public interface UserService {  
    public User createUser(User user);// 创建用户  
    public User updateUser(User user);// 更新用户  
    public void deleteUser(Long userId);// 删除用户  
    public void changePassword(Long userId, String newPassword); //修改密码  
    User findOne(Long userId);// 根据id查找用户  
    List<User> findAll();// 得到所有用户  
    public User findByUsername(String username);// 根据用户名查找用户  
}  

Java代码

public interface ClientService {  
    public Client createClient(Client client);// 创建客户端  
    public Client updateClient(Client client);// 更新客户端  
    public void deleteClient(Long clientId);// 删除客户端  
    Client findOne(Long clientId);// 根据id查找客户端  
    List<Client> findAll();// 查找所有  
    Client findByClientId(String clientId);// 根据客户端id查找客户端  
    Client findByClientSecret(String clientSecret);//根据客户端安全KEY查找客户端  
}  

Java代码

public interface OAuthService {
     
   public void addAuthCode(String authCode, String username);// 添加 auth code  
   public void addAccessToken(String accessToken, String username); // 添加 access token  
   boolean checkAuthCode(String authCode); // 验证auth code是否有效  
   boolean checkAccessToken(String accessToken); // 验证access token是否有效  
   String getUsernameByAuthCode(String authCode);// 根据auth code获取用户名  
   String getUsernameByAccessToken(String accessToken);// 根据access token获取用户名  
   long getExpireIn();//auth code / access token 过期时间  
   public boolean checkClientId(String clientId);// 检查客户端id是否存在  
   public boolean checkClientSecret(String clientSecret);// 坚持客户端安全KEY是否存在  
}   

此处通过OAuthService实现进行auth code和access token的维护。

后端数据维护控制器
具体请参考com.github.zhangkaitao.shiro.chapter17.web.controller包下的IndexController、LoginController、UserController和ClientController,其用于维护后端的数据,如用户及客户端数据;即相当于后台管理。

授权控制器AuthorizeController
Java代码

@Controller  
public class AuthorizeController {
     
  @Autowired  
  private OAuthService oAuthService;  
  @Autowired  
  private ClientService clientService;  
  @RequestMapping("/authorize")  
  public Object authorize(Model model,  HttpServletRequest request)  
        throws URISyntaxException, OAuthSystemException {  
    try {  
      //构建OAuth 授权请求  
      OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request);  
      //检查传入的客户端id是否正确  
      if (!oAuthService.checkClientId(oauthRequest.getClientId())) {  
        OAuthResponse response = OAuthASResponse  
             .errorResponse(HttpServletResponse.SC_BAD_REQUEST)  
 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值