我只是Spring
和Spring Security
的初学者。在这里,我使用Spring MVC
创建Spring Security
应用程序。我只想将经过身份验证的用户名保存到数据库中。使用以下表单我获取记录的用户名。但我不知道如何使用path=""
属性保存该用户名。
这是表格
<form:form modelAttribute="reservation">
<div>
<label for="name">Name</label>
<sec:authentication var="user" property="principal" />
<sec:authorize access="isAuthenticated()">
${user.username}
</sec:authorize>
</div>
<div>
<label for="emailAddress">Email</label>
<form:input path="emailAddress"/>
</div>
这是控制器
@RequestMapping(value="/flight-reservation", method={RequestMethod.POST})
public String doReservation(@Valid @ModelAttribute("reservation") FlightReservation reservation ,BindingResult result){
if(result.hasErrors()){
return "flight-reservation";
}
reservationService.save(reservation);
return "redirect://flight-reservation.html?ok=true";
}
我可以使用email
保存path="emailAddress"
但我的问题是如何使用username
其他内容保存已记录的path
。感谢您的帮助。
答案 0 :(得分:1)
感谢Spring MVC中的Spring安全集成,您直接将principal作为控制器参数:
@RequestMapping(value="/flight-reservation", method={RequestMethod.POST})
public String doReservation(@Valid @ModelAttribute("reservation") FlightReservation reservation,
BindingResult result, @AuthenticationPrincipal Principal principal){
// use principal (Authentication.getPrincipal) to extract user name and use it
....
此版本自Spring Security 3.2起有效如果您使用旧版本,则必须使用SecurityContextHolder
:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Principal principal = authentication == null ? null : authentication.getPrincipal();
假设您的身份验证对象返回UserDetails
,您可以这样使用它:
@RequestMapping(value="/flight-reservation", method={RequestMethod.POST})
public String doReservation(@Valid @ModelAttribute("reservation")
FlightReservation reservation ,BindingResult result,
@AuthenticationPrincipal UserDetails details){
if(result.hasErrors()){
return "flight-reservation";
}
reservation.setUser(details.getUserName); // adapt it to your real classes...
reservationService.save(reservation);
return "redirect://flight-reservation.html?ok=true";
}
这意味着您在JSP中使用${user.username}
来显示当前经过身份验证的用户名,但您可以直接从控制器中的Spring安全性获取它,并将其存储在reservation
中已经包含通过表单初始化的其他字段的对象,并将包含用户名的对象(或其包含的代表经过身份验证的用户的任何内容)传递给服务。这样,Spring安全性保证在数据库中编写的用户是经过身份验证的用户,即使它没有人尝试发送伪造的请求。
或者,Spring Framework Reference明确表示您可以将Principal
参数传递给@RequestMapping
带注释的方法,参数将接收the currently authenticated user
。实际上,您获得的是request.getUserPrincipal
,其中填充了Spring Security Authentication
所以你可以写一下:
@RequestMapping(value="/flight-reservation", method={RequestMethod.POST})
public String doReservation(@Valid @ModelAttribute("reservation") FlightReservation reservation,
BindingResult result, Principal principal){
Authentication auth = (Authentication) principal;
或直接Authentication
实施Principal
@RequestMapping(value="/flight-reservation", method={RequestMethod.POST})
public String doReservation(@Valid @ModelAttribute("reservation") FlightReservation reservation,
BindingResult result, Authentication auth){
并从那里获取用户名。