Spring Security/Технический обзор Spring Security: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 19:
Внутри <code>SecurityContextHolder</code> мы храним информацию о доверителе, взаимодействующим в настоящее время с приложением. Spring Security использует объект <code>Authentication</code> для представления этой информации. Как правило нет необходимости создавать объект <code>Authentication</code> самостоятельно, но запросы к объекту <code>Authentication</code> довольно распространенное действие. Вы можете использовать следующий код в любом месте вашего приложения, чтобы получить имя текущего зарегистрированного пользователя, например:
 
<sourcesyntaxhighlight lang="java">
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
Строка 26:
String username = principal.toString();
}
</syntaxhighlight>
</source>
 
Вызов <code>getContext()</code> возвращает экземпляр интерфейса <code>SecurityContext</code>. Это объект, который хранится в <code>ThreadLocal</code>. Как мы увидим ниже, большинство механизмов аутентификации в рамках Spring Security возвращают экземпляр <code>UserDetails</code> в качестве принципала.
Строка 35:
Возможно вы удивлены, когда я предоставил <code>UserDetails</code> объект? Как я это сделал? Я думаю, вы сказали, это было сделано декларативным способом и мне не потребовалось писать никакого Java кода — в этом дело? Короткий ответ заключается в том, что существует специальный интерфейс, называемый <code>UserDetailsService</code>. Единственный метод этого интерфейса принимает имя пользователя в виде String и возвращает <code>UserDetails</code>:
 
<sourcesyntaxhighlight lang="java">
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
</syntaxhighlight>
</source>
 
Это наиболее общий подход к загрузке информации о пользователе в Spring Security и вы увидите, что это используется в каркасе когда требуется информация о пользователе.
Строка 80:
С этого момента пользователь считается подлинным. Давайте рассмотрим код в качестве примера.
 
<sourcesyntaxhighlight lang="java">
import org.springframework.security.authentication.*;
import org.springframework.security.core.*;
Строка 126:
}
}
</syntaxhighlight>
</source>
 
Здесь мы написали маленькую программу, которая предлагает пользователю ввести имя и пароль, и выполняет выше описанные действия. <code>AuthenticationManager</code>, которые мы реализовали здесь, идентифицирует любого пользователя у которого имя совпадает с паролем. Для каждого пользователя назначается одна роль. Выше приведенный код выведет на экран нечто подобное:
Строка 235:
В поставляемом файле <code>spring-security-core-xx.jar</code>, вы найдете пакет <code>org.springframework.security</code>, который в свою очередь содержит файл <code>messages.properties</code>. На него должна быть установлена ссылка в вашем <code>ApplicationContext</code>, поскольку классы Spring Security реализуют Spring интерфейс <code>MessageSourceAware</code> и ожидают, что в преобразователь сообщений (message resolver) будет включена зависимость из контекста приложения в момент его запуска.. Обычно все, что Вы должны сделать, это зарегистрировать bean в контексте приложения, который будет ссылаться на сообщения. Ниже приведен пример:
 
<sourcesyntaxhighlight lang="xml">
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="org/springframework/security/messages"/>
</bean>
</syntaxhighlight>
</source>
 
<code>Messages.properties</code> назван в соответствии со стандартом пакетов ресурсов и содержит сообщения на языке по умолчанию, поддерживаемые Spring Security. Этот файл по умолчанию на английском языке. Если вы не зарегистрировали источник сообщений, Spring Security все равно будет работать правильно, и показывать английскую версию сообщений жестко заданных в коде.