2010-02-10 4 views
0

Я медленно схожу с ума, пытаясь настроить Spring Security 3.0.0 для защиты приложения.Весенняя безопасность с сертификатом X.509

Я настроил сервер (причал), чтобы потребовать аутентификацию клиента (используя смарт-карту). Однако, похоже, я не могу правильно реализовать реализацию applicationContext-security.xml и UserDetailsService.

Во-первых, из контекста приложения файла:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 


<security:global-method-security secured-annotations="enabled" /> 

<security:http auto-config="true"> 
    <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"/> 
    <security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="accountService" /> 
</security:http> 

<bean id="accountService" class="com.app.service.AccountServiceImpl"/> 

UserDetailsService выглядит следующим образом:

public class AccountServiceImpl implements AccountService, UserDetailsService { 

private static final Log log = LogFactory.getLog(AccountServiceImpl.class); 

private AccountDao accountDao; 

@Autowired 
public void setAccountDao(AccountDao accountDao) { 
    this.accountDao = accountDao; 
} 

public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException, DataAccessException { 

    log.debug("called loadUserByUsername()"); 
    System.out.println("called loadByUsername()"); 

    Account result = accountDao.getByEdpi(s); 
    return result; 

} 

}

Приложение имеет "титульный лист" с кнопкой Вход, поэтому доступ к этому не требует никакой проверки подлинности.

Любая помощь приветствуется.

ответ

4

Приложение имеет «главную страницу» с кнопкой «Вход», поэтому доступ к ней не требует никакой проверки подлинности.

Что-то не так. Если вы настроили свой контейнер сервлетов на , вам потребуется аутентификации клиента, у вас не может быть такой открытой для всех страницы, в этом случае авторизация авторизации не будет успешной для пользователей без смарт-карт, и они даже не смогут увидеть страницу с ошибкой на контейнере - Вместо этого это будет ошибка браузера.

Это может быть сделано делает контейнер позволяют клиенту AUTH и сделать Логин страницу открытой для анонимных пользователей и обеспечить другие страницы от SpringSec. Но я не буду рекомендовать это для приложения smartcard-PKI. Smartcard auth подразумевает важность безопасности, и более надежно, когда пользователи, не являющиеся смарт-картами, выкидываются на раннем этапе рукопожатия контейнера. В этом случае у вас может быть удобная страница входа в другой порт с кнопкой «Войти», связанной с вашим приложением.

Если вам нужна помощь в настройке SpringSecurity, добавьте больше информации о проблемах в сообщение.

+1

В Tomcat вы можете настроить его на то, чтобы он не нуждался в аутентификации клиента, но чтобы искать его, используя 'clientAuth =" want "' в коннекторе ' EpicPandaForce

1

С точки зрения конфигурации, это выглядит отлично. Какую ошибку вы видите? Вы видите, что ваш UserDetailsService вызывается с CN из сертификата X.509?

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