基于 Spring Security 实现在线用户统计需要进行以下步骤:
- 引入 Spring Security 相关依赖
我们需要在项目中引入 Spring Security 相关依赖,可以通过 Maven / Gradle 等方式引入,示例 Maven 依赖如下:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.5.0</version>
</dependency>
- 实现 Spring Security 的 UserDetailsService 接口
我们需要实现 Spring Security 的 UserDetailsService
接口,并在其中加载用户信息。这里我们以从数据库中获取用户信息为例,示例代码如下:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("Invalid username or password.");
}
return new CustomUserDetails(user);
}
}
其中,UserRepository
是一个 JPA 的 Repository 接口,findByUsername
方法可以根据用户名获取用户信息。CustomUserDetails
是我们自定义的 UserDetails
实现类。
- 配置 Spring Security
我们需要在 Spring Security 的配置中设置 UserDetailsService
,并开启 Session 管理,并设置 Session 过期时间,示例代码如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
http.formLogin()
.loginPage("/login").permitAll()
.defaultSuccessUrl("/")
.and()
.logout().permitAll();
http.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login?expired")
.sessionRegistry(getSessionRegistry());
http.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Bean
public SessionRegistry getSessionRegistry() {
return new SessionRegistryImpl();
}
@Bean
public AuthenticationTrustResolver getAuthenticationTrustResolver() {
return new AuthenticationTrustResolverImpl();
}
}
在这里,我们使用 CustomUserDetailsService
作为 UserDetailsService,通过 http.sessionManagement()
设置最大 Session 数量和过期后的跳转页面,通过 http.csrf().disable()
禁用 CSRF。
- 实现在线用户统计
我们需要在页面中显示在线用户的数量和列表。统计在线用户的数量可以通过 SessionRegistry
获取当前活跃的 Session 数量;统计在线用户列表需要通过 SessionRegistry.getAllPrincipals()
获取所有 Principal
,再通过 SessionRegistry.getAllSessions(Object principal, boolean includeExpiredSessions)
获取该 Principal
对应的所有 Session,示例代码如下:
@Controller
public class UserController {
@Autowired
private SessionRegistry sessionRegistry;
@RequestMapping("/online")
public String online(Model model) {
int total = sessionRegistry.getAllPrincipals().size();
model.addAttribute("total", total);
List<String> users = new ArrayList<>();
List<Object> principals = sessionRegistry.getAllPrincipals();
for (Object principal : principals) {
if (principal instanceof User) {
User user = (User) principal;
List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal, false);
for (SessionInformation session : sessions) {
if (session.isExpired()) {
continue;
}
users.add(user.getUsername());
}
}
}
model.addAttribute("users", users);
return "online";
}
}
在上述代码中,我们通过 Model
将在线用户数量和列表传递到页面中,页面可以通过类似下面的方式进行展示:
<p>当前共有 ${total } 个用户在线:</p>
<ol>
<#list users as username>
<li>${username }</li>
</#list>
</ol>
以上就是基于 Spring Security 实现在线用户统计的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何基于spring security实现在线用户统计 - Python技术站