从零开始java安全权限框架篇(四):security管理session

目录

 

一:基于Redis的Session共享

二:单体应用下Session功能的实现

1.获取到当前用户

2.获取到所有的当前登录用户

(1)SecurityConfig的配置文件

(2)Contoller中调用

3.剔除某一个用户

 4.同一个用户踢出上一次登录


一:基于Redis的Session共享

   上一节中,我们谈到了记住我功能的存储,这里我们将对session对一些处理,实现以下的一些功能:

   (1)获取当前登录用户

   (2)获取到所有的登录用户

   (3)踢出某一个登录用户

   (4)同账号登陆踢出功能

二:单体应用下Session功能的实现

  我们首先来看一下在单体应用下security的session操作功能的实现吧。

1.获取到当前用户

  其中的CurrentUser  是我继承security中User的,因为我需要扩展User里面的一些属性。有兴趣烦我前面的几篇。

package com.config.Seurity.util;


import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.WebAuthenticationDetails;

import com.config.Seurity.model.CurrentUser;




public class UserUtil {
	
	//获取到当前用户 
    public static CurrentUser currentUser() {
    	Authentication  auth=SecurityContextHolder.getContext().getAuthentication();    	
        Object principal = auth.getPrincipal();
    	CurrentUser  myUser=(CurrentUser) principal;
    	WebAuthenticationDetails  wauth=(WebAuthenticationDetails) auth.getDetails(); 
    	myUser.setUserIp(wauth.getRemoteAddress());   	 
    	return myUser;
    }


}

2.获取到所有的当前登录用户

(1)SecurityConfig的配置文件

//配置信息
		 @Override
		    protected void configure(HttpSecurity http) throws Exception { 
			
		       
		        //其他的已配置的略过。。
		        
		         http.sessionManagement()
		             .invalidSessionUrl("/view/login")
		             .maximumSessions(1)
		             .expiredUrl("/view/login")
		             .sessionRegistry(sessionRegistry());
		       
		         

		    }



     @Bean
		 public HttpSessionEventPublisher httpSessionEventPublisher() {
		      return new HttpSessionEventPublisher();
		 }
		 /**
		  * 注册bean sessionRegistry ,一定要注册,否则后面的Autowirte调用不出来
		  */
		 @Bean
		  public SessionRegistry sessionRegistry() {
		      return new SessionRegistryImpl();
		  }

  (2)Contoller中调用

@Autowired
private SessionRegistry sessionRegistry;

@RequestMapping(value="/getAllSessionUser")
	public DataResult getAllSessionUser() {
		List all=sessionRegistry.getAllPrincipals();
		return DataResult.buildSuccess(all);
	} 
  

    返回结果:

        从零开始java安全权限框架篇(四):security管理session_第1张图片

3.剔除某一个用户

	@Override
	public String kickSessionByUser(String[] userNames) {
		StringBuffer  noKickOut=new StringBuffer();
		List objs=this.getAllUser();
		
		for(Object obj:objs) {
			if(obj instanceof CurrentUser) {
				CurrentUser cou=(CurrentUser) obj;
				for(String userName:userNames) {
					if(cou.getUsername().equals(userName)) {
						// false代表不包含过期session
						List sessionInfos=sessionRegistry.getAllSessions(cou, false);
							if(sessionInfos != null  && sessionInfos.size() > 0) {							
								for(SessionInformation sessionInformation:sessionInfos) {
									sessionInformation.expireNow();
									sessionRegistry.refreshLastRequest(sessionInformation.getSessionId());
//									sessionRegistry.removeSessionInformation(sessionInformation.getSessionId());
								}							
							}else {
								noKickOut.append(cou.getUsername()+",");
							}
					}
				}
				
			}
		}		
		return noKickOut.toString();
	} 
  

  说新这个用户的页面会发现跳转到主页了

 4.同一个用户踢出上一次登录

  在登陆中添加如下一个方法

String[]  usernNames= {currentUser.getUserName()};
		sessionService.kickSessionByUser(usernNames);

 

你可能感兴趣的:(从零开始)