[英]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.