zoukankan      html  css  js  c++  java
  • Spring-security+Oauth2.0 零散知识汇总(备忘)

    //资源和认证服务器不相同
    http://xxxx:8080/flowAuth/oauth/authorize?client_id=jerry&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fAuthProvider%2ftest%2findex.do&response_type=code&scope=read

    //资源和认证服务器相同
    http://xxxx:8080/flowAuth/oauth/authorize?client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2fcc.do&response_type=code&scope=read

    http://xxxx:8080/flowAuth/oauth/authorize?client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do&response_type=code&scope=read

    //密码模式认证
    http://xxxx:8080/flowAuth/oauth/authorize?username=Miki&password=123456&grant_type=password&scope=read&client_id=fuck&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do&response_type=code

    //获取access_token
    http://xxxx:8080/flowAuth/oauth/token?client_id=jerry&client_secret=1111&grant_type=authorization_code&code=FlmXb7&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fflowAuth%2ftest%2findex.do

    {
    "access_token":"3e85af06-245e-433f-a533-400dccba6b12",
    "token_type":"bearer",
    "refresh_token":"58f4dabb-8c54-4cdd-af36-b87d64eeda94",
    "expires_in":43199,
    "scope":"read"
    }

    获取access_token后访问资源 [POST]
    http://xxxx:8080/flowAuth/test/index.do?access_token=cd105a0e-506f-4696-ab6c-0ad59afe3bfa
    Authorities:资源


    //刷新access_token
    http://xxxx:8080/flowAuth/oauth/token?client_id=fuck&client_secret=2222&grant_type=refresh_token&refresh_token=4f6d41ba-7170-4160-84c9-e59c9210b304

    第三方如你需要下载csdn上的资源,不想注册,那么可以调用qq oauth接口登录,此时,csdn是第三方客户端,qq是服务器,资源的提供端,调用qq ouath接口,服务器端创建token
    和相应秘钥,将用户重定向到用户确认界面,询问是否确认授权,用户同意,重定向到第三方客户端,客户端用返回的token请求服务器端,获取access_token和秘钥,及用户信息。

    <!--一个自定义的filter,必须包含 authenticationManager,accessDecisionManager,securityMetadataSource三个属性-->

    客户端对象重要的属性有:
    clientId:(必须)客户端id。
    secret:(对于可信任的客户端是必须的)客户端的私密信息。
    scope:客户端的作用域。如果scope未定义或者为空(默认值),则客户端作用域不受限制。
    authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。
    authorities:授权给客户端的权限(Spring普通的安全权限)。

    OAuth的参与实体至少有如下三个:

    · RO (resource owner): 资源所有者,对资源具有授权能力的人.
    · RS (resource server): 资源服务器,它存储资源,并处理对资源的访问请求。
    · Client: 第三方应用,它获得RO的授权后便可以去访问RO的资源。

    此外,为了支持开放授权功能以及更好地描述开放授权协议,OAuth引入了第四个参与实体:

    · AS (authorization server): 授权服务器,它认证RO的身份,为RO提供授权审批流程,并最终颁发授权令牌(Access Token)。

    协议的基本流程如下:

    (1) Client请求RO的授权,请求中一般包含:要访问的资源路径,操作类型,Client的身份等信息。

    (2) RO批准授权,并将“授权证据”发送给Client。至于RO如何批准,这个是协议之外的事情。典型的做法是,AS提供授权审批界面,让RO显式批准。这个可以参考下一节实例化分析中的描述。
    (3) Client向AS请求“访问令牌(Access Token)”。此时,Client需向AS提供RO的“授权证据”,以及Client自己身份的凭证。
    (4) AS验证通过后,向Client返回“访问令牌”。访问令牌也有多种类型,若为bearer类型,那么谁持有访问令牌,谁就能访问资源。
    (5) Client携带“访问令牌”访问RS上的资源。在令牌的有效期内,Client可以多次携带令牌去访问资源。
    (6) RS验证令牌的有效性,比如是否伪造、是否越权、是否过期,验证通过后,才能提供服务。

    授权码类型的开放授权协议流程描述如下:

    (1) Client初始化协议的执行流程。首先通过HTTP 302来重定向RO用户代理到AS。Client在redirect_uri中应包含如下参数:client_id, scope (描述被访问的资源), redirect_uri (即Client的URI), state (用于抵制CSRF攻击). 此外,请求中还可以包含access_type和approval_prompt参数。当approval_prompt=force时,AS将提供交互 页面,要求RO必须显式地批准(或拒绝)Client的此次请求。如果没有approval_prompt参数,则默认为RO批准此次请求。当 access_type=offline时,AS将在颁发access_token时,同时还会颁发一个refresh_token。因为 access_token的有效期较短(如3600秒),为了优化协议执行流程,offline方式将允许Client直接持refresh_token 来换取一个新的access_token。

    (2) AS认证RO身份,并提供页面供RO决定是否批准或拒绝Client的此次请求(当approval_prompt=force时)。

    (3) 若请求被批准,AS使用步骤(1)中Client提供的redirect_uri重定向RO用户代理到Client。redirect_uri须包含 authorization_code,以及步骤1中Client提供的state。若请求被拒绝,AS将通过redirect_uri返回相应的错误信 息。

    (4) Client拿authorization_code去访问AS以交换所需的access_token。Client请求信息中应包含用于认证Client身份所需的认证数据,以及上一步请求authorization_code时所用的redirect_uri。

    (5) AS在收到authorization_code时需要验证Client的身份,并验证收到的redirect_uri与第3步请求authorization_code时所使用的redirect_uri相匹配。如果验证通过,AS将返回access_token,以及refresh_token(若access_type=offline)。

    多个<intercept-url>元素为不同URL的集合定义不同的访问需求,它们会被归入一个有序队列中,每次取出最先匹配的一个元素使用。

    一个http的配置对应一个资源,http可以配置一组action,http标签的url-pattern属性配置url资源,也可以使用通配
    符配置一组资源
    <authentication-manager>
    <authentication-provider>
    <user-service>
    <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />4
    <user name="user" password="user" authorities="ROLE_USER" />
    </user-service>
    </authentication-provider>
    </authentication-manager>
    authorities属性,这里定义了这个用户登陆之后将会拥有的权限,它与上面intercept-url中定义的权限内容一一对
    应。每个用户可以同时拥有多个权限


    框架自己提供的URL路径是/oauth/authorize(授权端),/oauth/token (令牌端),/oauth/confirm_access (用户发送确认授权到这里),还有/oauth/error (用户呈现授权服务器授权出错的请求)。

    authorizedGrantTypes:授权给客户端使用的权限类型。默认值为空。


    token - tokenService
    client - clientDetailService
    user - userDetailsService

    Spring Security已经定义了一些Filter,不管实际应用中你用到了哪些,它们应当保持如下顺序。
    (1)ChannelProcessingFilter,如果你访问的channel错了,那首先就会在channel之间进行跳转,如http变为https。
    (2)SecurityContextPersistenceFilter,这样的话在一开始进行request的时候就可以在SecurityContextHolder中建立一个SecurityContext,然后在请求结束的时候,任何对SecurityContext的改变都可以被copy到HttpSession。
    (3)ConcurrentSessionFilter,因为它需要使用SecurityContextHolder的功能,而且更新对应session的最后更新时间,以及通过SessionRegistry获取当前的SessionInformation以检查当前的session是否已经过期,过期则会调用LogoutHandler。
    (4)认证处理机制,如UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter等,以至于SecurityContextHolder可以被更新为包含一个有效的Authentication请求。
    (5)SecurityContextHolderAwareRequestFilter,它将会把HttpServletRequest封装成一个继承自HttpServletRequestWrapper的SecurityContextHolderAwareRequestWrapper,同时使用SecurityContext实现了HttpServletRequest中与安全相关的方法。
    (6)JaasApiIntegrationFilter,如果SecurityContextHolder中拥有的Authentication是一个JaasAuthenticationToken,那么该Filter将使用包含在JaasAuthenticationToken中的Subject继续执行FilterChain。
    (7)RememberMeAuthenticationFilter,如果之前的认证处理机制没有更新SecurityContextHolder,并且用户请求包含了一个Remember-Me对应的cookie,那么一个对应的Authentication将会设给SecurityContextHolder。
    (8)AnonymousAuthenticationFilter,如果之前的认证机制都没有更新SecurityContextHolder拥有的Authentication,那么一个AnonymousAuthenticationToken将会设给SecurityContextHolder。
    (9)ExceptionTransactionFilter,用于处理在FilterChain范围内抛出的AccessDeniedException和AuthenticationException,并把它们转换为对应的Http错误码返回或者对应的页面。
    (10)FilterSecurityInterceptor,保护Web URI,并且在访问被拒绝时抛出异常。


    引到用户到地址"oauth/authorize" 如果用户同意 跳转至回调uri+code=CODE
    发起换取access_token的请求

    1.获得授权码(code/token)
    2.获取accesstoken
    3.通过accesstoken,获取OpenID
    4.通过OpenID和accesstoken调用API,获取获取用户信息

    OAuth2.0中目前有四种授权类型:Authorization Code,implicit,password,client credentials

    oauth2.0的基本流,
    1.请求用户授权,
    2.获取code,
    3.获取token,
    4.请求资源验证token.

    因此,只需要关注
    WebServerOAuth2Filter,
    BasicUserApprovalFilter,
    OAuth2AuthorizationFilter,
    OAuth2ProtectedResourceFilter,
    其中WebServerOAuth2Filter是/oauth/user/authorize入口,验证code无效,unapprovedAuthenticationHandler跳转到/oauth/confirm_access,用户提交之后 BasicUserApprovalFilter拦截之后,获取授权参数,就交给 WebServerOAuth2Filter获取code,获取code返回到client,然后client再次请求 /oauth/authorize,OAuth2AuthorizationFilter获取token,之后只要请求的时候带上token由 OAuth2ProtectedResourceFilter负责验证,是否可获取用户资源.


    处理认证请求("/aouth/authorize")的类:AuthorizationEndpoint

    标签 <authorization-server></authorization-server> 的属性名列表

    authorization-code
    implicit
    refresh-token
    client-credentials
    password
    custom-grant
    client-details-service-ref
    toen-endpoint-url
    authorization-endpoint-url
    token-granter-ref
    token-services-ref
    authorization-request-manager-ref
    user-approval-handler-ref
    user-approval-ref
    error-page
    approval-parameter-ref

  • 相关阅读:
    JVM — 类加载机制
    java 异常处理
    (前篇:NIO系列 推荐阅读) Java NIO 底层原理
    (六:NIO系列) 相关设计模式
    (五:NIO系列) Reactor模式
    (四:NIO系列) Java NIO Selector
    (三:NIO系列) Java NIO Channel
    (二:NIO系列) Java NIO Buffer
    (一:NIO系列)JAVA NIO 简介
    java 线程池(线程的复用)
  • 原文地址:https://www.cnblogs.com/LoveHe/p/5569252.html
Copyright © 2011-2022 走看看