spring security - 访问UserDetailsS​​ervice实现中的请求参数

时间:2016-04-20 07:34:44

标签: java spring-mvc spring-security

我正在开发一个java spring mvc应用程序。我已经实现了UserDetailsService接口,如下所示:

@Component
@Transactional
public class SecurityDAO implements UserDetailsService{

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

     ....
}

我需要在loadUserByUsername方法中找到用户登录URL(因为该项目有多个登录URL)。实际上,我想访问UserDetailsService实施中的请求参数。

4 个答案:

答案 0 :(得分:10)

只需在您的服务上注入请求:

 @Autowired
 private HttpServletRequest request;

要使它工作,你需要先注册RequestContextListener,但是:

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

答案 1 :(得分:4)

所有信息均可通过HttpServletRequest获取。您可以通过以下方式获取它:

依赖注入

最简单的方法是将servlet请求直接注入UserDetailsService:类:

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的特殊范围代理,因此您可以从单例范围的MyDetailsService访问请求范围的请求“bean”。在引擎盖下,每次调用request的参数都会路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal,您也可以直接访问该RequestContextHolder HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder. currentRequestAttributes()). getRequest(); 。正如您所看到的,Spring在确定范围规则时非常灵活。它只是有效。

BEGIN FOR tname IN (select table_name from all_tab_columns where column_name = 'ID' and owner='PACC_USER') LOOP EXECUTE IMMEDIATE 'select unique id from ' || tname; END LOOP; End;

另一种方法是使用RequestContextHolder

PLS-00306: wrong number or types of arguments in call to '||'

进一步阅读:

答案 2 :(得分:2)

简单方法: 1)注册RequestContextListener

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

2)到主要课程:

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

3)之后我们可以在自定义标题中使用参数:

request.getHeader("OrganizationId")

答案 3 :(得分:0)

您可以使用

获取当前请求
HttpServletRequest request  =
 ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
        .getRequest();

然后从那里访问请求参数。