在这个Spring Boot应用程序中,有一个Web服务,它为登录用户返回一些数据:
@RequestMapping("/resource")
public Map<String, Object> home() {
Map<String, Object> model = new HashMap<String, Object>();
model.put("id", UUID.randomUUID().toString());
model.put("content", "Hello World");
return model;
}
Run Code Online (Sandbox Code Playgroud)
想象一下,该方法的返回值取决于当前登录的用户.
如何找出该方法中登录的用户?
应用程序记录所有请求的urls.这意味着,使用url参数进行身份验证至关重要,因为这会导致日志中充满对的情况(login=abc&password=123).出于这个原因,我已配置spring-security为从中读取参数request-body.这是通过将以下行添加到request-header:
'Content-Type': 'application/x-www-form-urlencoded'
Run Code Online (Sandbox Code Playgroud)
身体将是:
{'login':'admin', 'password':'password'}
Run Code Online (Sandbox Code Playgroud)
没关系,但QA强迫我通过url参数禁用身份验证的可能性.目前,对以下URL的POST也将进行身份验证:
https://example.com/foo?login=admin&password=password
Run Code Online (Sandbox Code Playgroud)
有没有人知道禁用此选项的技巧?最好带注释.
由于评论,我决定在我的问题中添加更多细节.我的弹簧安全配置spring-security.我有
http.usernameParameter("login")
.passwordParameter("password")
(...)
Run Code Online (Sandbox Code Playgroud)
这使得WebSecurityConfigurerAdapter在参数和正文中搜索登录数据.我希望禁用在网址中搜索这些参数.
目前我使用 request.setAttribute() 和 request.getAttribute() 作为将对象从处理程序拦截器传递到控制器方法的一种方式。我不认为这是一种理想的技术,因为它要求我将 HttpServletRequest 作为我的控制器方法的参数。Spring 在向控制器隐藏请求对象方面做得很好,所以除了这个目的我不需要它。
我尝试使用 @RequestParam 注释和我在 setAttribute() 中设置的名称,但当然这不起作用,因为请求属性不是请求参数。据我所知,没有用于属性的 @RequestAttribute 注释。
我的问题是,是否有更好的方法将对象从拦截器传递给控制器方法,而无需将它们设置为请求对象的属性?
我已经设置了一个 Spring HandlerInterceptor 来向 HttpServletRequest 添加一个属性,以便能够从控制器读取它,遗憾的是这似乎不起作用,这对我来说似乎很奇怪。我做错了吗?知道如何将数据从拦截器传输到控制器吗?
这是两个受影响的类的简化代码
public class RequestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
request.setAttribute("my-role", "superman");
}
[...]
}
@RestController
@RequestMapping("Test")
public class TestController {
public final Logger logger = LoggerFactory.getLogger(getClass());
@RequestMapping(value = "something")
public void something(HttpServletRequest request) {
logger.info(request.getAttribute("my-role"));
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
request.getAttribute("my-role") 返回空值...但如果我在 HandlerInterceptor 的 postHandle 中读取它确实返回异常值,我觉得我错过了一些东西...
编辑:我发现通过“request.getSession().setAttribute”进行会话很有用,但我仍然不明白为什么请求本身在这个用例中不起作用。