如何将经过身份验证的用户名保存到数据库中

时间:2015-08-21 13:35:14

标签: java spring spring-mvc spring-security

我只是SpringSpring 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。感谢您的帮助。

1 个答案:

答案 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){

并从那里获取用户名。