Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在@Service或@Dao层中使用HttpServletRequest来获取用户提供的凭据?_Spring Boot - Fatal编程技术网

Spring boot 如何在@Service或@Dao层中使用HttpServletRequest来获取用户提供的凭据?

Spring boot 如何在@Service或@Dao层中使用HttpServletRequest来获取用户提供的凭据?,spring-boot,Spring Boot,我已经在我的项目中使用SpringBoot实现了安全层。现在,我想知道如何使用@Service或@Dao层中的HttpServletRequest获取请求参数。我尝试了一些方法来获取请求参数,我可以输入用户名和密码,但我需要在Dao中传递它们。我的代码: 安全层代码: @Order(securityproperty.ACCESS\u OVERRIDE\u Order) 公共类应用程序安全性扩展了WebSecurity配置适配器{ @自动连线 UserDao UserDao; @自动连线 Http

我已经在我的项目中使用SpringBoot实现了安全层。现在,我想知道如何使用
@Service
@Dao
层中的
HttpServletRequest
获取请求参数。我尝试了一些方法来获取请求参数,我可以输入用户名和密码,但我需要在Dao中传递它们。我的代码:

安全层代码:

@Order(securityproperty.ACCESS\u OVERRIDE\u Order)
公共类应用程序安全性扩展了WebSecurity配置适配器{
@自动连线
UserDao UserDao;
@自动连线
HttpServletRequest请求;
@自动连线
@限定符(“userDetailsService”)
用户详细信息服务用户详细信息服务;
用户详细信息用户详细信息;
@自动连线
私有重新身份验证入口点身份验证入口点;
@自动连线
私有重新身份验证FailureHandler身份验证FailureHandler;
@自动连线
私有重新验证SuccessHandler authenticationSuccessHandler;
@凌驾
public void configure(WebSecurity web)引发异常{
忽略();
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
获取参数(“用户名”);
http.authorizeRequests().antMatchers(“/”、“/index.html”、“/home.html”、“/static/*”、“/home/*”、“/login.html”、“/login”).permitAll();
http.authorizeRequests().anyRequest().fullyAuthenticated().and().httpBasic().and().csrf().disable();
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
http.formLogin().usernameParameter(“用户名”).passwordParameter(“密码”).loginProcessingUrl(“/login/authenticate”).successHandler(authenticationSuccessHandler);
http.formLogin().failureHandler(authenticationFailureHandler);
http.logout().logoutRequestMatcher(新的AntPathRequestMatcher(“/logout”)).invalidateHttpSession(true);
http.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
//CSRF令牌处理
http.addFilterAfter(新的CsrfTokenResponseHeaderBindingFilter(),CsrfFilter.class);
http.addFilterBefore(tokenProcessingFilter(),RequestFetcher.class);
}
/**
*配置处理身份验证的身份验证管理器bean
*请求。
*/
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
//基于Dao的身份验证
auth.userDetailsService(userDetailsService).passwordEncoder(新的Md5PasswordEncoder());
}
私有AccessDeniedHandler AccessDeniedHandler(){
返回新的AccessDeniedHandler(){
@凌驾
公共无效句柄(HttpServletRequest请求、HttpServletResponse响应、,
AccessDeniedException(AccessDeniedException)引发IOException、ServletException{
response.getWriter().append(“拒绝访问”);
答复:setStatus(403);
}
};
}
/**
*这用于散列用户的密码
*当我们需要使用BCrypt时。
*/
@豆子
公共密码编码器PasswordEncoder(){
返回新的BCryptPasswordEncoder(10);
}
/**
*当使用表单登录时,这个bean将加载用户特定的数据。
*/
@豆子
公共用户详细信息服务用户详细信息服务(){
返回新的MyCustomUserDetailsService(userDao);
}
@豆子
public RequestFetcher tokenProcessingFilter()引发异常{
RequestFetcher tokenProcessingFilter=新的RequestFetcher();
setAuthenticationManager(authenticationManager());
返回令牌处理过滤器;
}
}
公共类RequestFetcher扩展UsernamePasswordAuthenticationFilter{
私有字符串用户名=”;
私有字符串密码=”;
@凌驾
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
HttpServletRequest httpRequest=this.getAsHttpRequest(请求);
userName=httpRequest.getParameter(“用户名”);
System.out.println(“==用户名===”+用户名);
password=httpRequest.getParameter(“密码”);
System.out.println(“==密码===”+密码);
链式过滤器(请求、响应);
}
私有HttpServletRequest getAsHttpRequest(ServletRequest请求){
if(!(HttpServletRequest的请求实例)){
抛出新的RuntimeException(“需要HTTP请求”);
}
返回(HttpServletRequest)请求;
}
公共字符串getUserName(){
返回用户名;
}
public void setUserName(字符串用户名){
this.userName=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
}

有人能帮我获取请求参数吗?

您不应该。。。您不希望也不应该将服务层或dao层绑定到web层。另外,您的
RequestFetcher
也很危险,它无法正确处理多个并发请求。只有一个实例,想象一下如果有多个请求进入,会发生什么情况,
username
password
的值会是多少。@M.DeinumI同意。但是,如何使用HttpServletRequest或其他概念来获取用户名和密码。我使用了spring security http.formLogin()处理登录请求,因此在本例中我无法获取用户名和密码。您对此有何想法?为什么需要用户名/密码?如果您想利用实现正确接口的Spring Security来处理登录和身份验证。如果您在自己的服务中需要该用户,请使用
SecurityContextHold