[英]How does spring security work on a Servlet
我有一個調用Servlet的Java:
public class UserServlet extends HttpServlet {
@Autowired
private UserService userService;
@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
userService.checkUser();
userService.doSomethingRestricted();
}
@Override
public void init(final ServletConfig config) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
super.init(config);
}
}
還有我的自動接線服務:
@Component(value = "userService")
public class UserService {
public boolean checkUser() {
if (SecurityContextHolder.getContext().getAuthentication() != null) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getPrincipal() != null && auth.getPrincipal() instanceof User) {
User springUser = (User) auth.getPrincipal();
if (springUser != null) {
LOG.debug("USER CONNECTED :: {}", springUser.getUsername());
}
}
} else {
LOG.debug("NO CONNECTED USER, CREATING ONE");
Collection<GrantedAuthority> authorities = getGrantedAuthorities();
org.springframework.security.core.userdetails.User springUser = new org.springframework.security.core.userdetails.User("user","password", true, true, true, true, authorities);
Authentication auth = new UsernamePasswordAuthenticationToken(springUser, "", authorities);
SecurityContext sc = new SecurityContextImpl();
sc.setAuthentication(auth);
SecurityContextHolder.setContext(sc);
}
return true;
}
@Secured({ "CONNECTED" })
public void doSomethingRestricted() {
LOG.debug("SOMETHING RESTRICTED HAS BEEN DONE!!");
}
}
當我第一次測試應用程序時,Java客戶端將POST
發送到服務器,服務器將檢查用戶並且找不到上下文:將創建一個新的上下文。
在隨后的幾次運行Java客戶端時,我發現了一個現有的上下文(在第一次調用中創建的上下文)。
顯然缺少某些內容,因為如果第一個用戶成功登錄,並不意味着任何用戶都可以連接。
我想念什么? 最初,我考慮過為每個Java客戶端實例使用會話(我沒有Web瀏覽器客戶端,因此我需要手動設置會話ID),但是Spring應該何時在http請求中獲取或設置會話ID?
TL; DR :在我的示例中, SecurityContextHolder.getContext().getAuthentication()
做什么?
是否添加了當前登錄用戶的身份驗證詳細信息
<bean id="httpSessionFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>
為了引入Web應用程序的登錄,spring security也設計為可與POJO一起使用,如果您使用舊方法,則需要在映射中添加此過濾器。 如果您在applicationContext中使用http標記,則它應該可以正常工作。
</security:filter-chain-map>
自從我在applicatin Context中使用了沒有新的http標記的spring security以來已經有很長時間了。 Spring安全性上下文帶有不同的過濾器,SecurityContextPersistenceFilter確定如何持久化上下文。
“ org.springframework.security.web.context.SecurityContextPersistenceFilter”用於持久保存每個會話的安全上下文。
春季安全性源自其與acegi安全性的集成,該安全性過去曾為同一任務使用“ net.sf.acegisecurity。ui.webapp.HttpSessionIntegrationFilter”過濾器
這是一個過濾器,因此spring可以基於sessionid識別會話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.