Um
Você pode especificar o provedor de autorização da sua preferência em seu arquivo de configuração XML do Spring. Você pode fazer isso ao configurar authentication-manager como definido no esquema http://www.springframework.org/schema/security/spring-security-3.1.xsd do Spring.
<xs:element name="authentication-manager">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="authentication-provider">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="security:any-user-service"/>
<xs:element name="password-encoder">...</xs:element>
</xs:choice>
<xs:attributeGroup ref="security:ap.attlist"/>
</xs:complexType>
</xs:element>
<!-- This is BIG -->
<xs:element name="ldap-authentication-provider">...</xs:element>
</xs:choice>
<xs:attributeGroup ref="security:authman.attlist"/>
</xs:complexType>
</xs:element>
Isso significa, por exemplo, que você pode usar qualquer provedor de autenticação, incluindo autenticação simples e JDBC, como mostrado no snippet abaixo:
<authentication-manager alias="authenticationManager">
<authentication-provider>
<user-service>
<user authorities="ROLE_GUEST" name="guest" password=""/>
</user-service>
</authentication-provider>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider>
</authentication-manager>
Dois
Você pode configurar as regras de autenticação em seu arquivo XML do Spring ao lincar as URLs às regras do usuário utilizando o elemento intercept-url. O elemento intercept-url é um elemento filho do elemento http, cuja definição resumida parece com isto:
<xs:element name="http">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="intercept-url">
<xs:complexType>
<xs:attributeGroup ref="security:intercept-url.attlist"/>
</xs:complexType>
</xs:element>
<!-- Details omitted for clarity -->
<xs:element name="access-denied-handler">...</xs:element>
<xs:element name="form-login">...</xs:element>
<xs:element name="openid-login">...</xs:element>
<xs:element name="x509">...</xs:element>
<xs:element ref="security:jee"/>
<xs:element name="http-basic">...</xs:element>
<xs:element name="logout">...</xs:element>
<xs:element name="session-management">...</xs:element>
<xs:element name="remember-me">...</xs:element>
<xs:element name="anonymous">...</xs:element>
<xs:element name="port-mappings">...</xs:element>
<xs:element ref="security:custom-filter"/>
<xs:element ref="security:request-cache"/>
<xs:element name="expression-handler">...</xs:element>
</xs:choice>
<xs:attributeGroup ref="security:http.attlist"/>
</xs:complexType>
</xs:element>
Exemplo de uso:
<security:http>
<security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
<security:intercept-url pattern="/account/**" access="hasRole('ROLE_USER')" />
<security:intercept-url pattern="/**" access="hasRole('ROLE_ANONYMOUS')" />
<!-- other elements removed for clarity -->
</security:http>
Três
Você pode codificar e validar a senha utilizando diversas classes que implementam a interface org.springframework.security.authentication.encoding.PasswordEncoder do Spring. Ela tem apenas dois métodos: encodePassword e isPasswordValid. Suas muitas implementações incluem:
- BaseDigestPasswordEncoder
- BasePasswordEncoder
- LdapShaPasswordEncoder
- Md4PasswordEncoder,
- Md5PasswordEncoder
- MessageDigestPasswordEncoder
- MessageDigestPasswordEncoder
- PlaintextPasswordEncoder
- ShaPasswordEncoder
Quatro
Você pode restringir o acesso a elementos da página utilizando a tag da biblioteca do Spring Security. Para utilizar essa biblioteca, deve incluir a seguinte definição de taglib em seu JSP:
<%@ taglib prefix=”sec” uri=”http://www.springframework.org/security/tags” %>
A taglib contém três tags úteis:
- authorize
- authentication
- accesscontrollist
A mais útil parece ser a tag authorize, que, tomando o exemplo da documentação do Spring, pode ser utilizada de duas formas. Primeiro, você pode autorizar apenas determinados perfis.
<sec:authorize access="hasRole('supervisor')">
This content will only be visible to users who have
the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s.
</sec:authorize>
e autorizar através de URLs
<sec:authorize url="/admin"> This content will only be visible to users who are authorized to send requests to the "/admin" URL. </sec:authorize>
A URL especificada deve estar amarrada à tag intercept-url descrita no item 2.
Cinco
Você pode realizar autorização no nível de método utilizando as anotações do Spring.
- @PreAuthorize(“spEL expression”)
- @PostAuthorize(“spEL expression”)
- @Secure
onde a expressão spEL pode ser qualquer coisa, mas normalmente é algo como: hasRole(‘ROLE_USER’).
Para permitir @PreAuthorize(…) e @PostAuthorize(…), adicione o seguinte ao arquivo de configuração XML:
<global-method-security pre-post-annotations=”enabled” />
@PreAuthorize(…) é utilizado como mostrado no exemplo a seguir:
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteUser(String username);
Para permitir @Secure, adicione o texto a seguir ao arquivo de configuração do Spring:
<global-method-security pre-post-annotations=”enabled” />
Seis
Você pode realizar segurança pelo nível de método utilizando a implementação JSR-250 do Spring ao acrescentar a configuração seguinte ao arquivo do Spring:
<global-method-security jsr250-annotations=”enabled”/>
As anotações da segurança JSR-250 são um subconjunto das anotações do JSR-250 e incluem:
- @RolesAllowed({“ROLE_USER”,”ROLE_ADMIN”})
- @PermitAll
- @DenyAll
Quando utilizada, a anotação JSR-250 parecem com algo como isso:
@RolesAllowed({"ROLE_ADMIN","ROLE_USER"})
public void deleteUser(String username);
Sete
Você pode integrar o Spring Security com a autenticação OpenID em pouco passos. O primeiro deles é escrever um formulário JSP simples onde o valor de ação está configurado para j_spring_openid_security_check, que, no mínimo, parece com algo deste tipo:
<form action="j_spring-openid-security-check" method="post"> <label for="openid_idenifier">Login</label>: <input id="openid_identifier" name="openid_identifier" type="text"/> <input type="submit" value="Login" /> </form>
O próximo passo é acrescentar o elemento openid-login ao http:
<xs:element name="http">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="openid-login">
<xs:annotation>
<xs:documentation>
Sets up form login for authentication with an
Open ID identity
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded"
ref="security:attribute-exchange" />
</xs:sequence>
<xs:attributeGroup ref="security:form-login.attlist" />
<xs:attribute name="user-service-ref" type="xs:token">
<xs:annotation>
<xs:documentation>
A reference to a user-service (or
UserDetailsService bean) Id
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<!-- Other elements omitted for clarity -->
</xs:choice>
</xs:complexType>
</xs:element>
Como todos os elementos filhos do openid-login são opcionais, o jeito mais simples de dar permissão ao OpenID é escrever:
<http auto-config="true"> <openid-login/> <!-- other tags and attributes omitted for clarity --> </http>
Por último, você irá precisar acrescentar o spring-security-openid.jar ao seu projeto.
Oito
Você pode configurar o seu aplicativo para autenticar ao usuários com um servidor LDAP (Lightweight Directory Access Protocol) embutido utilizando a configuração XML. Isso está descrito no esquema XML resumido abaixo:
<xs:element name="ldap-server">
<xs:complexType>
<xs:attributeGroup ref="security:ldap-server.attlist" />
</xs:complexType>
</xs:element>
<xs:attributeGroup name="ldap-server.attlist">
<xs:attribute name="id" type="xs:token">
<xs:annotation>
<xs:documentation>
A bean identifier, used for referring to the bean elsewhere in the context.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="port" type="xs:positiveInteger"/>
<xs:attribute name="ldif" type="xs:string">
<xs:annotation>
<xs:documentation>
Explicitly specifies an ldif file resource to load
into an embedded LDAP
server. The default is classpath*:*.ldiff
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="root" type="xs:string">
<xs:annotation>
<xs:documentation>
Optional root suffix for the embedded LDAP server. Default is
"dc=springframework,dc=org"
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:attributeGroup>
O arquivo LDIF, onde LDIF significa “LDAP Interchange Format”, é um arquivo em formato texto puro utilizado para descrever um conjunto de registros LDAP.
Um exemplo de uso do elemento ldap-server poderia ser:
<ldap-server ldif=”classpath:my-ldif-file.ldif” id=”localserver” />
Para utilizar a integração do LDAP com o Spring Security, lembre-se de incluir o arquivo spring-security-ldap.jar no POM.XML do seu projeto.
Nove
Você pode configurar o seu aplicativo para autenticar usuários com um servidor LDAP remoto utilizando a configuração XML. Isto está descrito no esquema XML exibido abaixo:
<xs:element name="ldap-server">
<xs:complexType>
<xs:attributeGroup ref="security:ldap-server.attlist" />
</xs:complexType>
</xs:element>
<xs:attributeGroup name="ldap-server.attlist">
<xs:attribute name="id" type="xs:token">
<xs:annotation>
<xs:documentation>
A bean identifier, used for referring to the bean elsewhere
in the context.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="url" type="xs:token"/>
<xs:attribute name="port" type="xs:positiveInteger"/>
<xs:attribute name="manager-dn" type="xs:string">
<xs:annotation>
<xs:documentation>
Username (DN) of the "manager" user identity which will be used to
authenticate to a (non-embedded) LDAP server. If omitted, anonymous
access will be used.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="manager-password" type="xs:string">
<xs:annotation>
<xs:documentation>
The password for the manager DN. This is required
if the manager-dn is specified.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:attributeGroup>
A documentação afirma que o elemento ldap-server “Define a localização de um servidor LDAP ou inicia um servidor embutido. A url indica a localização do servidor remoto. Se nenhuma url for fornecida, um servidor embutido será iniciado, e ficará escutando no número da porta fornecida. A porta é opcionalm e a porta padrão 33389 é utilizada. O bean LDAP ContextSource do Spring será registrado pelo servidor com o id fornecido”.
Este é o exemplo de uma configuração realmente mínima:
<ldap-server url=”ldap://myServer/dc=captaindebug,dc=com:389″ id=”ldapExternal”
manager-dn=”uid=admin,ou=users,ou=systems” manager-password=”s3cret”/>
Uma vez tendo o servidor configurado, você também precisa configurar o fornecedor da autenticação LDAP. Parece haver vários métodos para fazer isso, e não é algo tão objetivo, portanto, possivelmente falarei mais sobre isso mais tarde…
Dez
Você pode adicionar o atributo requires-channel=”https” ao elemento <intercept-url /> da configuração do Spring Security para forçar qualquer URL que case, para utilizar HTTPS. Por exemplo, se você quiser garantir que a senha será sempre criptografada antes de ser enviada, então você pode adicionar este XML resumido a sua configuração:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login" requires-channel="https"/>
<!-- Other attributes and elements omitted -->
</https>
Há algumas outras coisas a serem feitas aqui, mas haverá mais sobre isso mais tarde…
Talvez você tenha percebido que eu utilizei o arquivo de esquema XML do Spring Security (http://www.springframework.org/schema/security/spring-security-3.1.xsd) para explicar alguns dos recursos na minha lista de coisas que você pode fazer com o Spring Security. Em novembro de 2011, escrevi um artigo sobre a anotação @PostConstruct do JSR-250 do Spring que continha um erro (sim, de fato acontece), que foi corretamente apontado pelo Chris Beam – @Cbeam, que deixou um comentário na versão JavaLobby do meu blog. Decidi checar os esquemas e percebi que ambos estavam incorretos (apesar de estar bem mais errado do que o Chris) – o artigo do Captain Debug está agora, até onde sei, correto.
Segurança em aplicativos é um tema complexo e, caso seja alguma coisa que você esteja querendo olhar mais de perto, sugiro adquirir uma cópia do Spring Security 3, de Peter Mularien – que também é recomendado pelo pessoal do Spring.
Finalmente, se há uma ideia importante para apreciar sobre o Spring Security é que, como uma ferramenta de aplicativo, ele permite uma riqueza recursos de ajustes de segurança. Você deveria, portanto, permitir que o Spring Security lidasse com o máximo de detalhes de segurança possível, em vez de desnecessariamente escrever seu próprio código.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.captaindebug.com/2012/11/a-list-of-things-you-can-do-with-spring.html#.UX_9REBDs25



