2016-08-23 2 views
0

인증서 기반 인증을 사용하기 위해 사용자 비밀번호에서 변환 할 레거시 애플리케이션이 있습니다. 나는 톰캣 7 사용하고, 내 응용 프로그램은 사용자가 예를 들어 액세스모든 레벨의 인증에서 X509를 사용하는 스프링 보안

를 시도하는 응용 프로그램의 URL에 기반 보안의 4 가지 유형 지원해야합니다 : 몇 서블릿은 몇 서블릿이 사용하는 HTTP HTTPS를 사용하는 것 어떤 인증도없이 몇몇 서블릿은 PKI를 사용하여 상호 인증을 사용하지만 사용자는 미리 알 수 없기 때문에 인증서 체인에 유효한 인증서가있는 모든 사용자에게 액세스 권한이 부여됩니다. 응용 프로그램 재설정은 관리이므로 미리 정의 된 사용자 인증서 CN을 기반으로 역할 기반 액세스 권한을 갖습니다.

나는 =

은 내가 HTTPS

을 필요로 할 모든 URL을 나열하는 springSecurityFilterChain을 가지고 내 애플리케이션의 web.xml을 내 톰캣 server.xml에 "원하는"clientAuth 443에서 커넥터 실행 HTTPS를

springSecurityContext.xml에는 속성 파일에서 사전 등록 된 사용자 및 역할을 읽는 subject-principal-regex = "CN = (. *?)"user-service-ref = "userDetailsService"가있는 x509 섹션이 있습니다. . 거기에서, 나는 intercept-url 패턴을 나열한다. require-channel = "https"패턴이 어떤 역할을 요구하는지 알고 싶다.

나는 또한 내가 전용 액세스를 설정하여 HTTPS를 필요로 원하는 URL을 추가 = "IS_AUTHENTICATED_ANONYMOUSLY"절편-URL

이것은 나에게 내가 의지 위의 URL의 이후 필요한 4 개 요구 사항의 3을 얻는다 스프링 보안을 사용하여 HTTP에서 HTTPS로 자동 리디렉션하고 역할에 대해 사용자 자격 증명을 적용하거나 클라이언트 인증서를 전혀 확인하지 않습니다. web.xml springSecurityFilterChain에 포함되지 않은 URL 패턴은 HTTP 연결을 허용합니다.

마지막으로 알아낼 수없는 것은 응용 프로그램이 인증서 체인의 CA에 대해 유효성을 검사 할 클라이언트 인증서를 요청하지만 역할이있는 알려진 사용자 데이터베이스에 대해서는 유효하지 않습니다. . 그들은 유효한 인증서를 갖게 될 것인데, 클라이언트 인증서에 액세스해야만 발견 할 수 있지만 실제로는 내 시스템에 알려지지는 않습니다. 응용 프로그램의 일반 사용자이기 때문입니다. 나는 이것을 달성하는 방법을 잘 모르겠습니다.

내가 말한 내용을 보여주기 위해 내 3 개의 XML 파일에있는 일부 발췌 문장이 있습니다. springSecurity에는 httpsandcertlink가 포함되어 있는데 어느 것을 추가할지 보여주기 위해 작동하지만 작동하지 않습니다.

server.xml에

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme"https" secure="true"
clientAuth="want" sslProtocol"TLS"
keystoreFile="doesntmatter"
truststoreFile="doesntmatter" />

웹.XML

<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>MYAPP</realm-name>
</login-config>

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping> 01 23, <filter-name>springSecurityFilterChain</filter-name>
<url-pattern>*.go</url-pattern>
<url-pattern>/httpsonlylink</url-pattern>
<url-pattern>/httpsandcertlink</url-pattern>
</filter-mapping>

springSecurityContext.xml

<security:http xmlns="http://www.springframework.org/schema/security" >
<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="userDetailsService" />
<security:intercept-url pattern="/management**" requires-channel="https" access="ROLE_MGMT" />
01,
<security:intercept-url pattern="/httpsandcertlink**" requires-channel="https" --not sure what to change here-- />
</security:http>

<security:authentication-manager xmlns="http://www.springframework.org/schema/security" alias="authenticationManager">
<security:authentication-provider>
<security:user-service id="userDetailsService" properties="\WEB-INF\users.properties" />
</security:authentication-provider>
</security:authentication-manager>

답변

0

한 가지 방법은 추가로 "유효한 인증서"역할을 만들어 역할 요구 사항에 누락 된 요구 사항을 피기 백하는 것 모든 사용자에게 자동으로 할당됩니다. 유효한 인증서 체인이 이미 필요하므로 유효한 인증서가 필요하고 "유효한 인증서"역할이 필요한 URL과 일치하는 차단 태그를 설정하고이 규칙이 과 일치하는지 확인해야합니다. 이후에는 특정 역할이 필요한 것입니다.

+0

그래서 나는 이것도 생각했지만 예제를 찾을 수 없었습니다. 지금, 나는 한 줄의 user-service id = "userDetailsService"properties = "\ WEB-INF \ users.properties"라는 인증 공급자를 가지고있다. 난 그 목록에없는 모든 사용자에 대한 기본 역할을하는 방법을 모르겠습니다. 그렇게하기 위해 Java 클래스를 작성해야합니까, 아니면 .XML로도 수행 할 수 있습니까? – ffxhokie

+0

다음은 사용자 정의 userDetailsService 구현의 한 예입니다. http://howtodoinjava.com/spring/spring-security/custom-userdetailsservice-example-for-spring-3-security/ 여러분은 아마 더 간단 할 것입니다. 데이터 소스 설정이 필요하고'load'를 통해 부모를 호출 한 버전으로'loadUserByUsername()'을 오버라이드하고 결과에 "유효한 인증서"역할을 추가해야합니다. 그러면 그 역할만으로 새로운 사용자 객체가 생성됩니다 'super'가 null을 리턴하거나 그렇지 않으면 사용자를 찾을 수 없다고 지시했다면. Spring 문서에도 비슷한 예제가 있어야한다. –

+0

고마워,이게 내가 끝내 준거야. 나는 모든 사용자에게 역할을 할당 한 사용자 정의 userDetailsService 구현을 만들었지 만, 이는 쉽게 봄 보안 구현으로 작업을 마쳤습니다. 감사! – ffxhokie

관련 문제