응용 프로그램 시나리오
최근에, 지역 사회에는 항상 작은 광고가있는 기사를 게시 한 사람들이 있으며, 이는 커뮤니티 분위기에 심각한 영향을 미칩니다. 너무 화가 났어요! 이 유형의 사용자의 경우 영구적으로 차단해야합니다!
커뮤니티의 보안 프레임 워크는 스프링 보안 및 스프링 세션을 사용하며 로그인 상태는 30 일 동안 유효합니다. 세션 정보는 Redis에 존재합니다. 이 부정직 한 사용자를 우아하게 다루는 방법은 무엇입니까?
먼저 사용자의 권한을 간단히 나눕니다.
그런 다음 지정된 사용자 (role_user-> role_black)를 차단하고 사용자가 종료하도록 강제 (Redis에서 사용자 세션 정보를 삭제).
프로젝트 관련 종속성 및 구성
Maven 의존성
<!-보안-> <pectinement> <groupId> org.springframework.boot </groupId> <artifactid> Spring-Boot-Starter-Security </artifactid> </fectionency> <!-<pelection> <groupid> org.spramework.boot </groupactid> spring-boot-sporteRdit> </dependency> <!-스프링 세션 Redis-> <pectionency> <groupId> org.springframework.session </groupid> <artifactid> Spring-Session-Data-Redis </artifactid> </dependency>
스프링 세션 정책 구성 응용 프로그램 .yml
# redis 연결 관련 구성을 생략하여 여기 스프링 : 세션 : 상점 유형 : redis
스프링 보안 구성 코드 샘플
@enablewebsecuritypublic class websecurityconfig는 websecurityConfigurerAdapter {@override protected void configure (httpsecurity http)를 예외 {http .authorizeRequests () .antMatchers ( "/user/**"). .AntMatchers ( "/manager/**"). hasanyrole (roleenum.manager.getMessage ()) .AnyRequest (). permitAll (). (). formlogin (). loginpage ( "/login"). cermitall () .and (). logout (). csrf (). csrf (). }}강제 종료는 사용자 인터페이스에 할당됩니다
import com.spring4all.bean.responsebean; import com.spring4all.service.userservice; import lombok.allargsconstructor; import org.spramframework.session.findbyindexnamesessionsepository; import org.springframework.session.session; import org.springframework.session.data.redis.redisoperationssessionrepository; import org.springframework.bind.bind.annotation.getmapping; import org.spramframework.web.bind.annotation.pathvariable; import org.springframework.bind.antation.antotation.antotation org.springframework.web.bind.annotation.restcontroller; import java.util.arraylist; import java.util.list; import java.util.map;@restcontroller@allargsconstructorpublic class usermanageapi {private final findbynamessentsionreation <? 세션> 세션 보고서를 확장합니다. 개인 최종 RedisOperationsSessionRepositority redisoperationsSessionRepository; 개인 최종 사용자 서비스 사용자 서비스; /*** 지정된 사용자의 로그 아웃* @param userId user id* @return 사용자 세션 정보*/@preauthorize ( "hasrole ( 'manager')") @getMapping ( "/manager/logout/{userId}") public responsebean data (@PathVariable () Long UserID) {// query oniformnamenam (query user inforecior on on worly or regalname indec) 구현 문자열 indexname = userervice.getPrincipalNameIndexName (userId); // 사용자의 세션 정보를 쿼리하면 리턴 값 키는 SessionId Map <string,? session> useressions = sessionrepository.findbyIndexNameAndIndexValue (findByIndexNamesessionRepository.principal_name_index_name, indexname); // 사용자의 세션 정보 목록을 제거합니다 <string> sessionIds = new ArrayList <> (userSessions.keyset ()); for (문자열 세션 : sessionIds) {redisoperationssessessionRepository.deleteByid (세션); } return responsebean.success (useressions); }} 설명 indexname은 principal.getName ()의 리턴 값입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.