spring security 맞 춤 형 로그 인 정책

7320 단어 javaEE
최근 에 프로젝트 를 만 들 었 는데 안전 프레임 워 크 는 spring security 를 사용 합 니 다.업무 수요 로 인해 한 계 정 에 한 번 만 로그 인 할 수 있 고 여러 브 라 우 저 에서 로그 인 할 수 없습니다. 즉, 한 계 정 은 하나의 sessionid 만 대응 할 수 있 습 니 다.이것 은 아주 잘 실 현 됩 니 다. 기본 session 병행 정책 인 Concurrent Session Control Authentication Strategy 클래스 를 설정 하고 maximumSessions 값 을 1 로 설정 합 니 다.코드 는 다음 과 같 습 니 다:
<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);
        }

    }

}

사용자 정의 정책 의 배치 순 서 는 다른 정책 앞 에 있어 야 합 니 다. 그렇지 않 으 면 자신의 업무 논리 가 너무 늦게 실행 되 어 목적 을 달성 하지 못 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기