在我的Spring Security
网络应用程序中,我使用spring-security.xml
进行登录和注销。在我的<form-login login-page="/login" default-target-url="/"
authentication-failure-url="/login?error" username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
中,我有以下内容:
request.getSession().setAttribute("USERTO", userTO);
在登录期间,我将会话的用户详细信息设置为TO,如下所示:
userTO
其中UserTO
是具有@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(ModelMap model, @RequestParam(value = "error", required = false) String error, @RequestParam(value = "logout", required = false) String logout)
{
try
{
UserTO user = (UserTO) httpSession.getAttribute("USERTO");
if (error != null)
{
//error during login
}
if (logout != null)
{
//succesful logout
}
model.addAttribute("smartWCMLayoutID", "smartly");
model.addAttribute("cm", new CommonModel("", "", ""));
return "smartwcm.login.definition";
}
catch(Exception ex)
{
}
}
类型用户详细信息的对象。我的注销控制器方法如下:
UserTO
但在注销期间,我总是将let findMax l =
let rec helper(l,m) =
match l with
| [] -> m
| (x::xs) -> helper(xs, if (Some x > m) then Some x else m)
helper (l,None)
视为空。是否有任何方法可以在注销前从会话中捕获该值。
答案 0 :(得分:0)
我不会直接回答,但会向您展示另一种方法。我总是将以下课程附加到我的春季安全项目中:
public class LoggedUserUtils {
public static User getLoggedUser() {
final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
final Object principal = auth.getPrincipal();
if (principal instanceof User) {
return (User) principal;
}
return null;
}
}
它使用SecurityContext
存储UserDetails
。我总是在UserDetails
类中实现User
接口,因此它可以工作。
您可以在每个控制器,服务或存储库中使用上述静态方法(但我认为只有服务层是合适的,最终也是控制器)。如果通过不安全端点输入的呼叫没有进行身份验证,它将返回null
。