2016-08-23 2 views
0

У меня есть унаследованное приложение, которое я конвертирую из пароля пользователя, чтобы использовать аутентификацию на основе сертификата. Я использую Tomcat 7, и мое приложение должно поддерживать 4 типа безопасности на основе URL в приложении пользователь пытается получить доступSpring Security с X509 на всех уровнях аутентификации

Например: Несколько сервлетов будет использовать HTTP несколько сервлетов будет использовать HTTPS без какой-либо аутентификации несколько сервлетов будут использовать взаимную аутентификацию с использованием PKI, но пользователи не будут известны заранее, поэтому любому пользователю с действительным сертификатом в цепочке сертификатов будет предоставлен доступ. Сброс приложения - это управление, поэтому он будет иметь доступ на основе ролей на основе предварительно определенных пользовательских сертификатов CN.

У меня есть разъем работает HTTPS на 443 с clientAuth = «хочу» в моей Tomcat server.xml

У меня есть приложение web.xml, который имеет springSecurityFilterChain, в котором перечислены все URL, которые я хочу потребовать HTTPS

В моей SpringSecurityContext.xml есть раздел x509, который имеет subject-princip-regex = "CN = (. *?)," User-service-ref = "userDetailsService", который читает предварительно зарегистрированные пользователи и роли из файла свойств , Оттуда я перечисляю шаблоны перехвата-url, где я хочу иметь require-channel = "https", с какими шаблонами требуются какие роли.

Я также добавил URL, где я хотел, чтобы это требует HTTPS только настройки доступа = «IS_AUTHENTICATED_ANONYMOUSLY» как перехватывают-URL

Это заставляет меня 3 требований 4 мне нужно, так как любой из указанных выше воли URL-адресов автоматически перенаправлять с HTTP на HTTPS с использованием весенней безопасности и обеспечивать учетные данные пользователя против ролей или вообще не проверять сертификат клиента. URL-шаблоны, не помещенные в web.xml springSecurityFilterChain, будут принимать HTTP-соединения.

То, что я не могу понять, - это последний шаблон, который для приложения запрашивает сертификат клиента, который будет проверен против ЦС в цепочке сертификатов, но не против моей известной пользовательской базы данных с ролями , У них были бы действующие сертификаты, которые мне нужны для доступа к сертификату клиента для обнаружения, но на самом деле не известны в моей системе, поскольку они являются просто обычными пользователями приложения. Я не совсем уверен, как это сделать.

Вот несколько фрагментов из моих трех XML-файлов, чтобы показать, о чем я говорю. Я только включил httpsandcertlink в springSecurity, чтобы показать, какой из них я пытаюсь добавить, но не могу работать.

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>
<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" />
<security:intercept-url pattern="/httpsonlylink**" requires-channel="https" access="IS_AUTHENTICAED_ANONYMOUSLY" />
<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, который будет соответствовать любому 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/. Ваш, вероятно, будет проще, это не будет нужна какая-либо конфигурация источника данных и просто придется переопределить 'loadUserByUsername()' версией, которая назвала ее родительской через 'super', и добавить роль« действительного сертификата »в результат, создав новый пользовательский объект с этой ролью если 'super' возвращен null или иным образом указан, он не может найти пользователя. В весенних документах должен быть аналогичный пример. –

+0

Спасибо, это то, что я закончил делать. Я создал пользовательскую реализацию userDetailsService, которая назначила роль любому пользователю, найденному или нет, и это закончилось разработкой с помощью простой весовой реализации безопасности. Благодаря! – ffxhokie

Смежные вопросы