cas集成oauth,用新浪微博账号登录示例

cas官方已经在开发cas与oauth集成的插件,使用的是scribe-up这个项目来获取授权后的用户基本信息。计划在cas3.5.0版本时推出,不过现在已经可以用了,下面将以新浪微博为例,说明如何用新浪微博的账号登录cas,到https://github.com/Jasig/cas/tree/master/cas-server-support-oauth下载源码,把cas-server-support-oauth的依赖添加到你的cas项目中。

先定义两个类,SinaWeiboApi20.java和SinaWeiboProvider.java,SinaWeiboApi20.java主要定义新浪微博的授权链接,SinaWeiboProvider.java主要是获取用户授权后的用户信息。

SinaWeiboApi20.java

public class SinaWeiboApi20 extends DefaultApi20
{
  private static final String AUTHORIZE_URL = "https://api.weibo.com/oauth2/authorize?client_id=%s&redirect_uri=%s&response_type=code";
  private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s";

  @Override
  public Verb getAccessTokenVerb()
  {
    return Verb.POST;
  }

  @Override
  public AccessTokenExtractor getAccessTokenExtractor()
  {
    return new JsonTokenExtractor();
  }

  @Override
  public String getAccessTokenEndpoint()
  {
    return "https://api.weibo.com/oauth2/access_token?grant_type=authorization_code";
  }

  @Override
  public String getAuthorizationUrl(OAuthConfig config)
  {
    // Append scope if present
    if (config.hasScope())
    {
      return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope()));
    }
    else
    {
      return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()));
    }
  }
}

SinaWeiboProvider.java

public class SinaWeiboProvider extends BaseOAuth20Provider {
  
  @Override
  protected void internalInit() {
    if (scope != null) {
      service = new ServiceBuilder().provider(SinaWeiboApi20.class).apiKey(key)
          .apiSecret(secret).callback(callbackUrl).scope(scope).build();
    } else {
      service = new ServiceBuilder().provider(SinaWeiboApi20.class).apiKey(key)
          .apiSecret(secret).callback(callbackUrl).build();
    }
    String[] names = new String[] {"uid", "username"};
    for (String name : names) {
      mainAttributes.put(name, null);
    }
    
  }
  
  @Override
  protected String getProfileUrl() {
    return "https://api.weibo.com/2/statuses/user_timeline.json";
  }
  
  @Override
  protected UserProfile extractUserProfile(String body) {
    UserProfile userProfile = new UserProfile();
    JsonNode json = JsonHelper.getFirstNode(body);
    ArrayNode statuses = (ArrayNode) json.get("statuses");
    JsonNode userJson = statuses.get(0).get("user");
    if (json != null) {
      UserProfileHelper.addIdentifier(userProfile, userJson, "id");
      for (String attribute : mainAttributes.keySet()) {
        UserProfileHelper.addAttribute(userProfile, json, attribute,
            mainAttributes.get(attribute));
      }
    }
    JsonNode subJson = userJson.get("id");
    if (subJson != null) {
      UserProfileHelper
          .addAttribute(userProfile, "uid", subJson.getIntValue());
      
    }
    subJson = userJson.get("domain");
    if (subJson != null) {
      UserProfileHelper.addAttribute(userProfile, "username",
          subJson.getTextValue());     
    }

    return userProfile;
  }

}

添加SinaWeiboProvider bean声明到applicationContext.xml

<bean id="sinaWeibo" class="com.xxx.oauth.provider.SinaWeiboProvider">
		<property name="key" value="sinaweibo_key" />
		<property name="secret" value="sinaweibo_secret" />
		<property name="callbackUrl" value="https://sso.xxx.com:9443/login" />
	</bean>

其中callbackUrl为你cas的登录地址。

cas-servlet.xml 中定义OAuthAction bean

<bean id="oauthAction" class="org.jasig.cas.support.oauth.web.flow.OAuthAction"
   		p:centralAuthenticationService-ref="centralAuthenticationService"  >
		<property name="providers">
			<list>
				<ref bean="sinaWeibo" />				
			</list>
		</property>
	</bean>

添加oauthAction到cas的login-webflow.xml中,其主要功能是拦截oauth服务商返回的信息。

<action-state id="oauthAction"> 
		<evaluate expression="oauthAction" /> 
		<transition on="success" to="sendTicketGrantingTicket" /> 
		<transition on="error" to="ticketGrantingTicketExistsCheck" />
	</action-state>


添加OAuthAuthenticationHandler到deployerConfigContext.xml 中的authenticationHandlers处,使其支持oauth验证

<property name="authenticationHandlers">
			<list>		
				<bean class="org.jasig.cas.support.oauth.authentication.handler.support.OAuthAuthenticationHandler"> 
					<property name="providers">       
						<list>         
						    <ref bean="sinaWeibo" />         			      
						</list>     
					</property>   
				</bean>				
			</list>
		</property>

添加OAuthCredentialsToPrincipalResolverdeployerConfigContext.xml中的credentialsToPrincipalResolvers处。

<property name="credentialsToPrincipalResolvers">
			<list>		
				<bean class="org.jasig.cas.support.oauth.authentication.principal.OAuthCredentialsToPrincipalResolver" >	
				</bean>
			</list>
		</property>

如果想获取从oauth返回的用户信息,就必须添加OAuthAuthenticationMetaDataPopulator到deployerConfigContext.xml中authenticationMetaDataPopulators处。

<property name="authenticationMetaDataPopulators"> 
			<list> 
				<bean class="org.jasig.cas.support.oauth.authentication.OAuthAuthenticationMetaDataPopulator" /> 
			</list> 
		</property>

最后一步就添加用新浪微博账号登录的链接到登录页面

<a href="${SinaWeiboProviderUrl}">用新浪微博登录</a> 

大功告成!

参考资料:https://wiki.jasig.org/display/CASUM/OAuth+client+support

本文地址:http://blog.csdn.net/laigood12345/article/details/7567247

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值