springboot2+Shiro+Oltu+JSP全注解搭建基于OAuth2授权码模式授权平台示例

本文详细介绍了如何使用SpringBoot2、Shiro、Oltu和JSP搭建一个基于OAuth2授权码模式的授权平台。通过OAuth2协议流程,结合Apache Oltu的Java实现,阐述了从用户授权到资源访问的过程,并提供了运行演示和关键代码示例。
摘要由CSDN通过智能技术生成
OAuth2简单介绍

    OAuth 2 是一个授权框架,它通过一些协议约定,可以使第三方应用程序对服务器的资源、用户信息有一定的访问权限。OAuth 2 通过将用户身份验证委派给用户帐户的服务方以及通过服务方提供方授权给客户端,从而客户端可以访问用户帐户信息。具体的介绍参考OAuth2官网,协议规范可参考http://tools.ietf.org/html/rfc6749

  1. OAuth角色
    资源所有者: 能够授予对受保护资源的访问权限的实体。 当资源所有者是一个人时,它被称为最终用户。
    资源服务器:托管受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。
    客户端:代表受保护的资源请求的应用程序资源所有者及其授权。
    授权服务器:服务器校验客户端身份成功后向客户端发出访问令牌(accessToken)
    
    OAuth2.0协议流程图如下:
    在这里插入图片描述
    解释说明,这里用微信登录举例,可参考微信官方文档
        1.客户端从资源拥有者那请求授权,如某app需要用微信登录;
        2.用户点击同意登录之后,app得到一个授权许可,会返回一个code参数;
        3.app拿着code去请求授权服务器验证;
        4.身份验证成功后,授权服务器会返回一个资源访问令牌(accessToken)给app;
        5.app使用accessToken去资源服务器去请求需要的资源(如,微信用户的名称,头像,性别等)
        6.资源服务器在身份验证成功后返回相应的资源给客户端
Oltu介绍

    Apache Oltu是Java中的OAuth协议实现,对常用的方法、需要用到的工具进行封装,使用方法可参考:https://cwiki.apache.org/confluence/display/OLTU/Documentation

运行演示及其说明
  • 将server端和client分别打成war包放入tomcat运行后,在浏览输入 http://localhost:9080/oauth2-client/ 则会出现如下界面:在这里插入图片描述
  • 点击登录,则会跳转到如下界面在这里插入图片描述
    同时,观察控制台,可看出浏览器一共发了两次请求在这里插入图片描述
  • 输入账号密码
    【用户名:admin 密码:123456 】 即可登录成功
    在这里插入图片描述
    观察控制台, 浏览器又发了两次请求在这里插入图片描述
  • UML时序图及解释说明在这里插入图片描述
    说明:
        1. 用户点击【点击登录】时,由于在shiro的配置,会被OAuth2AuthenticationFilter进行拦截,由于身份认证没有通过,则会重定向到shiro配置的loginUrl(这里配置的是server端的地址)进行登录;
        2. 当用户输入账号密码后,点击【登录并授权】,则会带上client_id等参数去服务器进行身份验证;
        3. 服务器将验证客户端身份验证的结果会通过回调地址redirect_uri通知客户端,如果验证成功,则会给客户返回一个code(每次都不同);
        4. 客户拿着code去交换访问令牌(access_token);
        5. 当服务器校验客户端的code合法,则会将access_token返回;
        6. 客户端拿着access_token去访问受保护的资源。
代码部分

    说明:由于springboot整合JSP,所以需要打成war放在外部的tomcat进行运行,具体做法:springboot打成war包放入外部tomcat运行
    篇幅所限,完整代码已上传至GitHub:https://github.com/AmVilCres/others

  • 服务端核心代码
  1. 服务端目录结构
                      在这里插入图片描述

  2. ShirServerConfig类

@Configuration
public class ShiroServerConfig {
	
	// 注意: /r/n前不能有空格
	private static final String CRLF = "\r\n";

	private static final String MD5 = "md5";
		
	@Bean(name="hashedCredMatcher")
	public HashedCredentialsMatcher createHashCredentialsMatcher() {
		RetryLimitHashedCredentialsMatcher hcm = new RetryLimitHashedCredentialsMatcher();
		hcm.setHashAlgorithmName(MD5);
		hcm.setStoredCredentialsHexEncoded(true);
        hcm.setCacheManager(createEhcacheManager());
		return hcm;
	}

	@Bean(name
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值