spring security 맞 춤 형 로그 인 정책
7320 단어 javaEE
<sec:http use-expressions="false" auto-config="true">
<sec:session-management invalid-session-url="/sessionexpired" session-authentication-strategy ref="sas" />
sec:http>
<bean id="sas"
class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
<constructor-arg>
<list>
<bean
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
<constructor-arg ref="sessionRegistry" />
<property name="maximumSessions" value="1" />
<property name="exceptionIfMaximumExceeded" value="false" />
bean>
list>
constructor-arg>
bean>
그러나 이렇게 하면 계 정 a 가 한 곳 에서 로그 인 한 다음 에 다른 곳 으로 옮 겨 로그 인 하면 이전 사용자 session 이 효력 을 잃 게 됩 니 다. 즉, 앞 에 로그 인 한 사용 자 를 차 버 리 는 것 입 니 다.이 는 허용 되 지 않 으 며, 필요 한 요 구 는 사용자 의 어떤 상태 에 따라 판단 할 수 있 으 며, 사용자 가 빈 상태 에 있 으 면 같은 계 정 후 로그 인 한 사람 이 앞 에 로그 인 하 는 것 을 허용 하고 바 쁜 상태 라면 로그 인 을 허용 하지 않 는 다 는 것 이다.Concurrent Session Control Authentication Strategy 류 의 소스 코드 를 연구 하여 영감 을 얻 고 Session Authentication Strategy 의 실현 류 Cloudq Control Authentication Strategy 를 사용자 정의 합 니 다. 그 안에 상태 판단 을 추가 하고 조건 을 만족 시 키 지 않 으 면 이상 을 던 지면 문 제 를 해결 할 수 있 습 니 다.설정 코드 는 다음 과 같 습 니 다:
<bean id="sas"
class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
<constructor-arg>
<list>
<bean
class="com.raymon.cloudq.security.CloudqControlAuthenticationStrategy">
bean>
<bean
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
<constructor-arg ref="sessionRegistry" />
<property name="maximumSessions" value="1" />
<property name="exceptionIfMaximumExceeded" value="false" />
bean>
list>
constructor-arg>
bean>
사용자 정의 정책 코드:
public class CloudqControlAuthenticationStrategy implements SessionAuthenticationStrategy {
private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void onAuthentication(Authentication authentication, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws SessionAuthenticationException {
AuthUserDetails authUserDetails=(AuthUserDetails)authentication.getPrincipal();
Integer branchesId=authUserDetails.getClientEmpUser().getBranchesId();
Integer empId=authUserDetails.getClientEmpUser().getEmpId();
if( ){//
throw new SessionAuthenticationException(message);
}
}
}
사용자 정의 정책 의 배치 순 서 는 다른 정책 앞 에 있어 야 합 니 다. 그렇지 않 으 면 자신의 업무 논리 가 너무 늦게 실행 되 어 목적 을 달성 하지 못 할 수 있 습 니 다.