Skip to content

Commit 24f15ad

Browse files
committed
add session concurrency control
1 parent a21e66d commit 24f15ad

3 files changed

Lines changed: 53 additions & 9 deletions

File tree

springboot-springSecurity2/src/main/java/com/us/example/config/WebSecurityConfig.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@
22

33
import com.us.example.security.CustomUserService;
44
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;
6+
import org.springframework.context.annotation.Bean;
57
import org.springframework.context.annotation.Configuration;
68
import org.springframework.http.HttpMethod;
79
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
810
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
911
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1012
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
1113
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
14+
import org.springframework.security.core.session.SessionRegistry;
15+
import org.springframework.security.core.session.SessionRegistryImpl;
1216
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
17+
import org.springframework.security.web.session.HttpSessionEventPublisher;
1318

1419
/**
1520
* Created by yangyibo on 17/1/18.
@@ -22,7 +27,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
2227
@Autowired
2328
private CustomUserService customUserService;
2429

25-
2630
@Autowired
2731
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
2832
auth.userDetailsService(customUserService).passwordEncoder(new BCryptPasswordEncoder());
@@ -44,12 +48,13 @@ protected void configure(HttpSecurity http) throws Exception {
4448
.antMatchers("/**")
4549
.permitAll()
4650
.and()
47-
.sessionManagement()
48-
.and()
49-
.httpBasic();
51+
.sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);
52+
http.httpBasic();
5053
}
5154

52-
53-
55+
@Bean
56+
public ServletListenerRegistrationBean httpSessionEventPublisher() {
57+
return new ServletListenerRegistrationBean(new HttpSessionEventPublisher());
58+
}
5459
}
5560

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,54 @@
11
package com.us.example.controller;
22

33
import com.us.example.domain.SysUser;
4+
import org.springframework.security.core.Authentication;
45
import org.springframework.security.core.annotation.AuthenticationPrincipal;
6+
import org.springframework.security.core.context.SecurityContextHolder;
7+
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
8+
import org.springframework.stereotype.Controller;
59
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RequestMethod;
611
import org.springframework.web.bind.annotation.RequestParam;
712
import org.springframework.web.bind.annotation.ResponseBody;
8-
import org.springframework.web.bind.annotation.RestController;
13+
14+
import javax.servlet.http.HttpServletRequest;
15+
import javax.servlet.http.HttpServletResponse;
916

1017

1118
/**
1219
* Created by yangyibo on 17/3/1.
1320
*/
14-
@RestController
21+
@Controller
1522
public class LoginController {
1623

24+
/**
25+
* http://localhost:8080/login
26+
* http://localhost:8080/logout
27+
* @param loginedUser
28+
* @param logout
29+
* @return
30+
*/
1731
@RequestMapping(value = "/login")
1832
@ResponseBody
1933
//用户名密码是用base64 加密 原文为 admin:admin 即 用户名:密码 内容是放在request.getHeader 的 "authorization" 中
2034
public Object login(@AuthenticationPrincipal SysUser loginedUser, @RequestParam(name = "logout", required = false) String logout) {
2135
if (logout != null) {
22-
return null;
36+
return "logout";
2337
}
2438
if (loginedUser != null) {
2539
return loginedUser;
2640
}
2741
return null;
2842
}
43+
44+
// 此方法未用到
45+
// @RequestMapping(value="/logout", method = RequestMethod.GET)
46+
// @ResponseBody
47+
// public String logout (HttpServletRequest request, HttpServletResponse response) {
48+
// Authentication auth = SecurityContextHolder.getContext().getAuthentication();
49+
// if (auth != null){
50+
// new SecurityContextLogoutHandler().logout(request, response, auth);
51+
// }
52+
// return "logout ok";
53+
// }
2954
}

springboot-springSecurity2/src/main/java/com/us/example/domain/SysUser.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,18 @@ public void setGrantedAuthorities(List<? extends GrantedAuthority> authorities)
9898
this.authorities = authorities;
9999
}
100100

101+
@Override
102+
public String toString() {
103+
return this.username;
104+
}
105+
106+
@Override
107+
public int hashCode() {
108+
return username.hashCode();
109+
}
110+
111+
@Override
112+
public boolean equals(Object obj) {
113+
return this.toString().equals(obj.toString());
114+
}
101115
}

0 commit comments

Comments
 (0)