Осигурајте сигурност ваше Спринг апликације користећи робусне функције које нуди Спринг Сецурити фрамеворк.

Спринг Сецурити оквир обезбеђује вашу апликацију путем аутентификације и ауторизације. У свом подразумеваном стању, Спринг Сецурити обезбеђује да свака путања (или страница) ХТТП захтева у вашој апликацији захтева аутентификацију једног глобалног корисника.

Овај оквир је такође изузетно флексибилан. Омогућава вам да креирате прилагођена безбедносна правила за сваку путању ХТТП захтева у вашој апликацији, као и за различите кориснике. Дакле, можете уклонити безбедносно ограничење на страницама које не захтевају ауторизацију корисника (као што је почетна страница). И подесите улоге и овлашћења одређених типова корисника.

Додавање Спринг сигурности вашој апликацији

Постоје два начина да додате Спринг Сецурити вашој апликацији. Можете да га изаберете као зависност приликом генерисања нове Спринг Боот апликације користећи Спринг инитиализр, или га додајте у своју датотеку спецификације изградње у одељку зависности након генерисања пројекта.

instagram viewer

Ако сте изабрали једну од опција пројекта Градле, онда је датотека зависности буилд.градле. Међутим, ако сте изабрали Мавен, онда је та датотека пом.кмл.

Твоје буилд.градле датотека треба да садржи следећу зависност:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}

Док ваш пом.кмл датотека треба да садржи следећу зависност:


org.springframework.boot
spring-boot-starter-security

Пример апликације коришћен у чланку је доступан у овом ГитХуб спремиште и бесплатан је за коришћење под МИТ лиценцом.

Коришћење Спринг Сецурити-а

Када својој апликацији додате зависност Спринг Сецурити, можете одмах почети да користите оквир. Једноставно извршите своју апликацију, а затим идите на почетну страницу Спринг Боот-а (или било коју страницу у вашој апликацији). Пример апликације користи следећи почетни контролер да контролише подразумеване вредности Спринг Боот-а локални хост: 8080 захтев:

package com.springSecurityDemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclassWebController{

@GetMapping("/")
public String home(){
return"Welcome!";
}
}

Извршавање ваше апликације након додавања класе једног контролера изнад генерише следећи почетни приказ:

Приметићете да вас аутоматски усмерава на локални хост: 8080/логин страници, и то ради пре него што вам омогући приступ било којој другој страници апликације. У овој фази, мораћете да наведете подразумевано корисничко име (које је корисник) и аутоматски генерисану лозинку (коју ћете пронаћи у конзоли). Конзола ће генерисати линију попут следећег:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

Сваки пут када поново покренете апликацију аутоматски генерисана лозинка ће се променити, али корисничко име ће остати исто. Унос подразумеваног корисничког имена и лозинке усмериће вас на одговарајући приказ у вашој апликацији.

Прилагођавање Спринг Сецурити

Да бисте прилагодили безбедност апликације, мораћете да заобиђете подразумевану конфигурацију Спринг Сецурити-а. Али пре тога (под претпоставком да већ имате Спринг Веб) биће вам потребно неколико других зависности за овај пример апликације:

  • Спринг Дата ЈПА
  • МиСКЛ ЈДБЦ драјвер
  • Тхимелеаф
  • Ломбок

Тхимелеаф оквир ће генерисати различите погледе. Ломбок ће вам помоћи да смањите код у вашим објектним класама. ЈПА библиотека и МиСКЛ драјвер ће вам омогућити да користите МиСКЛ базу података са апликацијом, али имате опцију да користите било коју базу података која вам одговара. Коришћење базе података значи конфигурисање апликације.особине датотеку испод датотеке ресурса.

spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update

Горњи конфигурациони код вам омогућава да се повежете са локалном МиСКЛ базом података која се зове спринг_сецурити, са корисничким именом од корен, и лозинка (1234). Мораћете да ажурирате ове податке тако да одговарају називу ваше базе података и акредитивима.

Након што додате своје додатне зависности и креирате своју базу података, можете почети да одлучујете колико ће прегледа ваша апликација имати. Такође ћете морати да знате како изгледа безбедност сваке странице. Наш узорак апликације има 6 приказа:

  • Почетна страница
  • Страница за регистрацију
  • Страница за пријаву
  • Страница за одјаву
  • Корисничка страница
  • Страница са грешком

Једини приказ који ће захтевати ауторизацију корисника је корисничка страница. Ова страница је доступна само корисницима који се прво региструју, а затим се пријаве у апликацију. Поред подразумеваног пакета Спринг Боот-а, мораћете да креирате још четири пакета у вашој апликацији.

Класа контролора регистрације

Пакет контролера ће садржати класе које обрађују ХТТП захтеве. У зависности од функције странице, обично можете груписати сваки ХТТП захтев у једну класу контролера, као што је случај са ВебЦонтроллер класа. Међутим, приказ регистрације има више јединствених функција, тако да може имати класу приватног контролера:

@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;

publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}

Тхе РегистратионЦонтроллер цласс је капија ка безбедносном аспекту ваше апликације. Тхе @РекуестМаппинг анотација наводи тип захтева који ће овај контролер обрађивати (захтеви за локални хост: 8080/регистр).

Тхе @ГетМаппинг напомена једноставно означава да ако апликација прими захтев за /register, тхе образац за регистрацију() метод треба да обради тај захтев враћањем приказа регистрације.

Након што посетилац кликне на дугме за регистрацију, затим на @ПостМаппинг белешка долази у обзир. Тхе процессРегистратион() метода вам омогућава да објавите корисничке податке које добија од Образац за регистрацију класе у базу података, користећи УсерРепоситори класа. Али пре него што ускладишти ове податке, процессРегистратион() метод шифрује лозинку корисника користећи ПролећеПассвордЕнцодер интерфејс.

Креирање нових безбедносних конфигурација

Од Спринг 3.1, програмери сада могу да креирају конфигурације за Спринг Сецурити користећи Јаву, што значи класе уместо КСМЛ-а. Главна ствар коју ове конфигурационе класе захтевају је @Конфигурација Анотација.

@Configuration
publicclassSecurityConfiguration{
}

Тхе @Конфигурација напомена указује да је класа изнад конфигурациона класа. Ове класе пружају пасуљ за Контекст апликације Спринг, који је контејнер који Спринг користи за креирање и управљање различитим компонентама (или беан-овима) апликације. Први пасуљ у СецуритиЦонфигуратион класа је пассвордЕнцодер пасуљ.

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

Тхе РегистратионЦонтроллер разред користи пассвордЕнцодер беан да кодира нове лозинке пре него што их сачува у бази података. Још један важан пасуљ који ћете морати да додате у СецуритиЦонфигуратион класа је усерДетаилсСервице пасуљ.

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
 return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

Тхе усерДетаилсСервице пасуљ запошљава Пролећна безбедностУсерДетаилсСервице интерфејс за преузимање корисничког имена и лозинке за аутентификацију, током сесије пријављивања корисника. Дакле, чим корисник кликне на дугме за пријаву у приказу за пријаву, усерДетаилсСервице пасуљ се покреће.

Кроз УсерРепоситори, тхе усерДетаилсСервице беан добија приступ свим постојећим клијентима у бази података. Овај интерфејс затим користи УсерРепоситори да лоцира корисника са одговарајућим корисничким именом и лозинком, а затим враћа све атрибуте овог клијента као објекат.

Ако је враћени објекат купац, онда овај корисник добија приступ апликацији. У супротном, страница ће се аутоматски освежити омогућавајући кориснику да унесе важеће акредитиве.

Ланац филтера

Спринг Сецурити'сСецуритиФилтерЦхаин интерфејс је користан интерфејс за програмирање апликација (АПИ) који игра суштинску улогу у Спринг Сецурити конфигурацији. Овај интерфејс ради са Пролећна безбедностХттпСецурити класе за креирање ланца филтера за специфичне ХТТП захтеве.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
 return http.build();
}

Тхе филтерЦхаин пасуљ изнад користи СецуритиФилтерЦхаин АПИ за обављање неколико задатака. Прво, користи се ХттпСецурити класе да диктира да само корисници који имају улогу КОРИСНИКА могу приступити локални хост: 8080/корисник. А корисник добија ову улогу након регистрације, захваљујући гетАутхоритиес() метод који имплементира сваки нови објекат купца.

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

Ланац филтера омогућава неауторизован приступ свим другим УРЛ адресама у апликацији. Тхе филтерЦхаин пасуљ такође користи формЛогин() и одјавити се() методе на ХттпСецурити класни објекат.

Ове методе вам омогућавају да аутоматски усмерите корисника на одређене странице након што изврши задатак. Дакле, корисник који унесе исправне акредитиве и кликне на дугме за пријаву на /login страница ће аутоматски бити усмерена на /user страна.

Коначно, филтерЦхаин беан гради и враћа ланац филтера, који омогућава овлашћеним корисницима да приступе апликацији. Сва три пасуља у СецуритиЦонфигуратион раде заједно како би осигурали вашу пријаву.

Међутим филтерЦхаин пасуљ игра значајнију улогу у одређивању нивоа ауторизације за сваки ХТТП захтев. Када почнете да додајете више страница у своју апликацију, можете да користите филтерЦхаин беан да подесите њихов ниво безбедности.

Главна предност пролећне безбедности

Спринг Сецурити вам даје потпуну контролу не само над тим ко има приступ вашој апликацији, већ и над типом приступа који корисник може имати (преко његове функције корисничких улога). Контрола приступа је један од најважнијих аспеката сваке апликације. Давање општим корисницима нефилтрираног приступа вашој апликацији због ограничених баријера контроле приступа може се показати као скупа грешка.