Você está na página 1de 17

Módulo 4: Laboratório de Programação

Aula 24
Spring Security
Spring Security
● É um módulo do Spring com recursos avançados e de simples configuração
para ajudar com a segurança de uma aplicação.
● Tem foco principal na autenticação e na autorização.
● É altamente extensível.
● Num pequeno número de passos, é possível configurar uma autenticação via
base de dados ou mesmo por memória.
Autenticação
● A autenticação é o processo de verificação de identidade (digital) de um
utilizador.
● A autenticação pode ser feita através de uma combinação email e password, ou
então em situações mais avançadas através de um email de confirmação, sms,
impressão digital, validação de tokens, etc...
Autorização
● A autorização é o processo que valida o acesso de um utilizador a uma parte da
aplicação.
● Diz respeito aos privilégios que são concedidos a cada utilizador.

● Ex: Um administrador consegue aceder a páginas de gestão da aplicação, ao


contrário de um utilizador comum.
Autorização
● A autorização é o processo que valida o acesso de um utilizador a uma parte da
aplicação.
● Diz respeito aos privilégios que são concedidos a cada utilizador.

● Ex: Um administrador consegue aceder a páginas de gestão da aplicação, ao


contrário de um utilizador comum.
Como funciona o Spring Security?
Como funciona o Spring Security? (1)
● O Spring Security possui uma série de filtros.
● Quando um pedido chega ao servidor, este é interceptado pelos filtros.
● O mecanismo procurará, entre os vários existentes, o filtro que se adequa ao
pedido recebido.
● Assim que o filtro de autenticação correto seja encontrado, as credenciais
fornecidas são extraídas e validadas.
Como funciona o Spring Security? (2)
● Através das credenciais fornecidas, o filtro
UsernamePasswordAuthenticationFilter cria um objeto de autenticação
UsernamePasswordAuthenticationToken.
● Será este objeto Authentication que será usado na interface
AuthenticationManager.
Spring security
● É possível ainda configurar no Spring Security:
○ as páginas que cada utilizador pode aceder, dependendo do tipo de
permissão que possui.
○ as páginas de acesso não autorizado
○ a página de login
○ etc…
Spring Boot Security
● Para usar o Spring Security no Spring Boot é necessária a dependência
○ org.springframework.boot:spring-boot-starter-security
● Os dados para aceder à aplicação podem ser dados no applicaptio.properties
○ spring.security.user.name = foo
○ spring.security.user.password = bar
● Caso não haja nenhuma configuração, o Spring indicará uma password na
consola quando inicializado
○ Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6
Exemplo com WebSecurityConfigurerAdapter
● Para configurar a autenticação e a autorização, é necessário definir as
permissões de cada utilizador. Esta informação pode estar armazenada,
preferencialmente, na base de dados.

● Considere as seguintes tabelas e respetivas relações:


○ Entity User (id, username, password, List permissions)
○ Entity Permission (id, name, List users)
○ A relação entre o User e a Permission é de muitos para muitos
Exemplo com WebSecurityConfigurerAdapter

public class SpringWebSecurityInitializer extends AbstractSecurityWebApplicationInitializer {


}

public class UserSystem extends User { Classe User do package UserDetails

public UserSystem(String username, String password, Collection<? extends GrantedAuthority>


authorities) {
super(username, password, authorities);
}
}
Exemplo com WebSecurityConfigurerAdapter
@EnableWebSecurity
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

@Autowired
private LoginDetailsService loginDetailsService;

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeRequests()
.antMatchers("/countries").hasRole("ADMIN")
.antMatchers("/tasks").hasAnyRole("ADMIN", "USER")
.antMatchers("/").permitAll()
.and().formLogin();
}

@Override
protected void configure(AuthenticationManagerBuilder managerBuilder) throws Exception {
managerBuilder.userDetailsService(loginDetailsService);

@Bean
public PasswordEncoder getPasswordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
}
Exemplo com WebSecurityConfigurerAdapter
public class MyUserDetails implements UserDetails {
@Override
public boolean isAccountNonExpired () {
private String username ;
return true ;
}
public MyUserDetails (String username){
this.username = username;
@Override
}
public boolean isAccountNonLocked () {
return true ;
public MyUserDetails () {
}
}
@Override
@Override
public boolean isCredentialsNonExpired () {
public Collection <? extends GrantedAuthority > getAuthorities () {
return true ;
return Arrays .asList(new
}
SimpleGrantedAuthority( "ROLE_USER" ));
}
@Override
public boolean isEnabled () {
@Override
return true ;
public String getPassword () {
}
return "pass" ;
}
}

@Override
public String getUsername () {
return username ;
}
Exemplo com AuthenticationProvider
● A seguinte configuração adopta uma configuração diferente, mas também
válida.
● As principais diferenças entre a configuração anterior e a seguinte
Exemplo com AuthenticationProvider
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {

@Autowired
LoginService loginService ;

@Override
public Authentication authenticate (Authentication authentication) throws AuthenticationException {

String username = authentication.getName();


String password = authentication.getCredentials().toString();

User user = loginService .validateLogin( username , password );

if(user != null){
List<GrantedAuthority > roleList = new ArrayList<>();
for(Permission permission : user.getPermissions()){
roleList .add(new SimpleGrantedAuthority( "ROLE_" +permission .getName()));
}
return new UsernamePasswordAuthenticationToken( username , password , roleList );
}
return null ;
}

@Override
public boolean supports (Class<?> authentication) {
return authentication.equals( UsernamePasswordAuthenticationToken .class);
}
}
Bibliografia
● https://spring.io/guides/gs/securing-web/
● http://shazsterblog.blogspot.com/2018/10/spring-security-authentication-secu
rity.html
● https://blog.algaworks.com/spring-security/
● https://www.baeldung.com/spring-security-authentication-provider

Você também pode gostar