Pora zabezpieczyć stronę – niektóre jej części chcę pokazywać tylko zalogowanym użytkownikom.
Ukrycie całej strony za hasłem
Ukrycie całej strony za hasłem jest wyjątkowo proste. Wystarczy dodać do pom.xml następującą zależność:
1 2 3 4 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> |
Strona wygląda wtedy tak:

Skąd wiem, jakiego podać użytkownika i hasło?
- Jeśli nic dodatkowo nie konfigurowałam, mogę zalogować się przy użyciu nazwy użytkownika User oraz hasła zapisanego w logach serwera:
12345678910111213. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v1.3.3.RELEASE)2016-04-27 12:34:28.527 INFO 6048 --- [...2016-04-27 12:34:32.189 INFO 6048 --- [ost-startStop-1] b.a.s.AuthenticationManagerConfiguration :Using default security password: 55efeb20-713e-4999-9477-057b685e1a91 - Mogę też podać dane logowania w pliku application.properties:
12security.user.name=adminsecurity.user.password=temppswd
Zabezpieczenie na poziomie stron i metod
Dodaję do swojego kodu następującą klasę konfiguracyjną:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@Configuration @EnableGlobalMethodSecurity(securedEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { // sample users @Autowired public void configureAuth(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("justyna").password("123").roles("USER") .and() .withUser("aurora").password("321").roles("USER", "ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/signup", "/about", "/assets/**").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() .and().formLogin().defaultSuccessUrl("/") .and().logout().logoutSuccessUrl("/"); } |
W metodzie configureAuth
uzyskuję dostęp do obiektu AuthenticationManagerBuilder
i definiuję parę użytkowników i nadajemy im role (użytkownika lub administratora).
W metodzie configure
podaję, kto ma mieć dostęp do której części aplikacji. I tak:
- Do adresów wymienionych w linii 17 dostęp mają wszyscy, a więc nie tylko zalogowani użytkownicy.
- (18) Do stron pod adresem
/admin
i poniżej dostęp ma tylko użytkownik o prawach administratora. - (19) Do stron pod adresem
/user
i poniżej dostęp ma tylko użytkownik w roliUSER.
- (20) Do reszty stron dostęp mają tylko zalogowani użytkownicy, niezależnie od roli.
- Włączam dodatkowo standardowy formularz logowania (21) i ustawiam adres
/
jako domyślne miejsce lądowania po udanym zalogowaniu bądź wylogowaniu.
Dodam jeszcze następujący fragment kodu do mojego szablonu strony:
1 |
Logged in as <span sec:authentication="name" /> with authorities: <span sec:authentication="authorities" /> |
Uwaga! Żeby silnik szablonów Thymeleaf odpowiednio przetworzył ten fragment, w pom.xml muszę dodać zależność do artefaktu thymeleaf-extras-springsecurity4
.
Jak to wygląda na stronie?



Dodatkowo mogę definiować wymagania bezpieczeństwa w kodzie, przy każdej metodzie kontrolera, np.:
1 2 3 4 |
@Secured("ROLE_ADMIN") @RequestMapping(value = "/user", method = RequestMethod.POST) public String checkPersonInfo(@Valid User user, Model model, BindingResult bindingResult) { ... |
Kod jest dostępny w GitHubie.
Co dalej?
- Własny, ładniejszy formularz logowania 🙂
- Dynamiczne dodawanie nowych użytkowników
- Uwierzytelnianie i autoryzacja w oparciu o bazę danych
- Szyfrowanie