您可能已经看到有多少网站允许用户查看和强制注销其帐户的会话。我们可以轻松地使用这种强制注销功能来做同样的事情。我们已经提供了 UserSessionController,它获取当前登录用户的活动会话。你可以看到如下实现:
//src/main/java/com/packtpub/springsecurity/web/controllers/
UserSessionController.java
@Controller
public class UserSessionController {
private final SessionRegistry sessionRegistry;
@Autowired
public UserSessionController(SessionRegistry sessionRegistry) {
this.sessionRegistry = sessionRegistry;
}
@GetMapping("/user/sessions/")
public String sessions(Authentication authentication, ModelMap model) {
List<SessionInformation> sessions = sessionRegistry.getAllSessions
(authentication.getPrincipal(), false);
model.put("sessions", sessions);
return "user/sessions";
}
@DeleteMapping(value="/user/sessions/{sessionId}")
public String removeSession(@PathVariable String sessionId,
RedirectAttributes redirectAttrs) {
SessionInformation sessionInformation = sessionRegistry.
getSessionInformation(sessionId);
if(sessionInformation != null) {
sessionInformation.expireNow();
}
redirectAttrs.addFlashAttribute("message", "Session was removed");
return "redirect:/user/sessions/";
}
}
我们的 session 方法将使用 Spring MVC 自动获取当前 Spring Security Authentication。如果我们不使用 Spring MVC,我们还可以从 SecurityContextHolder 获取当前的 Authentication,如 第 3 章,自定义身份验证。然后使用主体获取当前用户的所有 SessionInformation 对象。通过迭代 sessions.html 文件中的 SessionInformation 对象可以轻松显示信息,如下所示:
//src/main/resources/templates/sessions.html
...
<tr th:each="session : ${sessions}">
<td th:text="${#calendars.format(session.lastRequest, 'yyyy-MM-dd HH:mm')}">
</td>
<td th:text="${session.sessionId}"></td>
<td>
<form action="#" th:action="@{'/user/sessions/{id}'(id=${session.sessionId})}"
th:method="delete" cssClass="form-horizontal">
<input type="submit" value="Delete" class="btn"/>
</form>
</td>
</tr>
...
您现在可以安全地启动 JBCP 日历应用程序并使用 Google Chrome 中的 [email protected]/user1 登录它。现在,使用 Firefox 登录并单击右上角的 [email protected] 链接。然后,您将在显示屏上看到两个会话,如以下屏幕截图所示:
在 Firefox 中,单击第一个会话的 Delete 按钮。这会将请求发送到 UserSessionsController 的 deleteSession 方法。这表明应该终止会话。现在,导航到 Google Chrome 中的任何页面。您将看到自定义消息说会话已被强制终止。虽然消息可以使用更新,但我们看到这是一个很好的功能,可以让用户终止其他活动会话。
其他可能的用途包括允许管理员列出和管理所有活动会话、显示站点上活动用户的数量,甚至扩展信息以包括 IP 地址或位置信息等内容。