【问题标题】:Spring Security OAuth2 event logSpring Security OAuth2 事件日志
【发布时间】:2017-09-20 01:16:00
【问题描述】:

我们要求在我们的应用程序中包含 OAuth2。为此,我们选择了 Spring Security 作为一种方法。我已经从 spring 安全项目页面查看了 Spraklr2 和 Tonr2 示例项目。它工作正常。

我们的新要求是,作为 outh2 提供者,我们必须保存每个请求日志(来自资源所有者的请求)。我们必须保存客户端 ID、资源所有者用户名、请求的 url(资源服务器上的资源)、授权等..

我搜索了一段时间,但没有找到任何线索。

有人可以帮助我实现这一目标吗..

提前致谢

【问题讨论】:

    标签: spring-security oauth-2.0


    【解决方案1】:

    当用户使用 Spring Oauth 进行身份验证时,它会向 AuthenticationEventPublisher 发布一个事件。您可以创建一个实现AuthenticationEventPublisher的组件,如下所示:

    @Component
    public class AuditEvent implements AuthenticationEventPublisher{
        @Override
        public void publishAuthenticationSuccess(Authentication authentication) {
            if(authentication instanceof UsernamePasswordAuthenticationToken) {
                log(authentication.getName(), "Authentication successful");
            }
        }
    
        @Override
        public void publishAuthenticationFailure(AuthenticationException exception, Authentication authentication) {
            log(authentication.getName(),"Authentication Failure:");
        }
    }
    

    并检查身份验证是否为UsernamePasswordAuthenticationToken 类型。这将为您提供登录事件,您可以根据需要登录。

    【讨论】:

      【解决方案2】:

      如果您的意思是要将所有请求记录到 /oauth/authorize 和 /oauth/token,您可以通过实现自己的端点来实现,这会将调用分别委托给 AuthorizationEndpoint 和 TokenEndpoint。

      当然,您必须在 XML 文件中配置它...

      【讨论】:

      • 我想为每个资源所有者请求在数据库中保存一条记录。我需要实现一个类(可能是拦截器)来完成这项工作。类/拦截器应该拦截每个请求,并捕获客户端 ID、请求的用户和请求的 url。我们只是想为我们的服务维护一个日志。这样我们就可以制作一份报告,其中包含每个用户的请求数量以及每个客户的请求数量以及最常用的资源......等等。不确定您的回答是否与我的问题相关......
      • 你要拦截的请求是什么?通常,oauth-server 除了发出访问令牌什么都不做。它唯一的 API 是 /authorize 和 /token。同意了吗?
      • 需要拦截对我的基于 spring REST 的应用程序的传入请求,该应用程序使用 spring security OAuth2 进行身份验证/授权。我想知道哪个用户点击了哪个网址以及通过哪个客户端。我的基于 REST 的应用程序和我的应用程序的服务器客户端中有几个 url。我所有的客户都获得了授权码授予类型。通过实现我自己的端点,我只能拦截与身份验证/授权相关的请求,对吧?但我想拦截对我的 REST 应用程序的所有请求。如果我不清楚,我很抱歉。
      【解决方案3】:

      如果你还没有找到答案,下面是我用来拦截请求的方法..

       <http  path-type="regex" 
          create-session="never" entry-point-ref="oauthAuthenticationEntryPoint"
          access-decision-manager-ref="accessDecisionManager" 
          use-expressions="true"     
          xmlns="http://www.springframework.org/schema/security">
          <anonymous enabled="false" />
          <custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="myFilterSecurityInterceptor" />
          <intercept-url pattern="/soap/*" access="isAnonymous()" method="GET" />
          <intercept-url pattern="/advisor/[0-9a-zA-Z_]/all/clients/[0-9]/[0-9]" access="isFullyAuthenticated()"/>
          <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
          <access-denied-handler ref="oauthAccessDeniedHandler" />
          <expression-handler ref="oauthWebExpressionHandler" />
      </http>
      
      
      <bean id="myFilterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
          <property name="authenticationManager" ref="authenticationManager"/>
          <property name="accessDecisionManager" ref="affirmativeBasedAccessDecisionManager"/>
          <property name="securityMetadataSource" ref="myCustomBean"/>
      </bean>
      
      <bean id="affirmativeBasedAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
          <constructor-arg>
              <list>
                  <bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"/>
                  <bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter"/>
              </list>
          </constructor-arg>
      </bean>
      
      <bean id="myCustomBean" class="MyCustomClass">
          <constructor-arg>
              <util:map />
          </constructor-arg>
      </bean>
      
      <authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
        <authentication-provider>
          <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query=
              "select username,password, enabled from oauth_users where username=?"
            authorities-by-username-query=
              "select username, role from oauth_user_roles where username =?  " />
        </authentication-provider>
      </authentication-manager>
      
      <bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
          <property name="realmName" value="realm" />
      </bean>
      
      <bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased" xmlns="http://www.springframework.org/schema/beans">
        <constructor-arg>
          <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            <bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/>
          </list>
        </constructor-arg>
      </bean>
      
          <bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
      
      <oauth:web-expression-handler id="oauthWebExpressionHandler" />
      

      公共类 MyCustomClass 扩展 DefaultFilterInvocationSecurityMetadataSource {

      public APILibSecurityMetadataSource(
              LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap) { 
          super(requestMap);
      }
      
      @Override
      public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
      System.out.println(" My code in MyCustomClass Interceptor");    
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 1970-01-01
        • 2019-04-29
        • 2017-09-11
        • 2019-04-28
        • 2015-11-14
        • 2016-07-12
        • 2017-01-18
        • 2012-12-19
        相关资源
        最近更新 更多