簡體   English   中英

spring security - 訪問UserDetailsS​​ervice實現中的請求參數

[英]spring security - access request parameters inside UserDetailsService implementation

我正在研究一個java spring mvc應用程序。 我已經實現了UserDetailsService接口,如下所示:

@Component
@Transactional
public class SecurityDAO implements UserDetailsService{

     @Override
     public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
         ...
     }

     ....
}

我需要在loadUserByUsername方法中找到用戶登錄URL(因為該項目有多個登錄URL)。 實際上, 我想訪問UserDetailsService實現中的請求參數。

只需在您的服務上注入請求:

 @Autowired
 private HttpServletRequest request;

要使它工作,您需要先注冊RequestContextListener,但是:

@Bean 
public RequestContextListener requestContextListener(){
    return new RequestContextListener();
} 

所有信息都可以通過HttpServletRequest 您可以通過以下方式獲取:

依賴注入

最簡單的方法是將servlet請求直接注入到UserDetailsService: class中:

public MyDetailsService implements UserDetailsService {

  @Autowired
  private HttpServletRequest request;

  //...

}

要么

public MyDetailsService implements UserDetailsService {

  @Autowired
  private HttpServletRequest request;

    public UserDetails loadUserByUsername(String username){
                HttpServletRequest request  =
             ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
                    .getRequest();
    }

}

如果您不是春季啟動,請記住將以下偵聽器添加到您的web.xml

<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

如果您使用的是彈簧靴,請在此處添加。

@Bean 
public RequestContextListener requestContextListener(){
    return new RequestContextListener();
}

更新:這是有效的,因為Spring注入了實現HttpServletRequest特殊范圍代理,因此您可以從singleton-scoped MyDetailsService訪問請求范圍的請求“bean”。 在引擎蓋下,對request參數的每次調用都會被路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal ,您也可以直接訪問它。 正如您所看到的,Spring在確定范圍規則時非常靈活。 它只是有效。

RequestContextHolder

另一種方法是使用RequestContextHolder

HttpServletRequest request = 
  ((ServletRequestAttributes) RequestContextHolder.
    currentRequestAttributes()).
    getRequest();

進一步閱讀:

簡單方法:1)注冊RequestContextListener

@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}

2)到主要班級:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();

3)之后我們可以在自定義標題中使用參數:

request.getHeader("OrganizationId")

您可以使用獲取當前請求

HttpServletRequest request  =
 ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
        .getRequest();

然后從那里訪問請求參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM