Spring Security çerçevesinin sunduğu sağlam özelliklerden yararlanarak Spring uygulamanızın güvenliğini sağlayın.

Spring Security çerçevesi, uygulamanızı kimlik doğrulama ve yetkilendirme yoluyla korur. Spring Security, varsayılan durumunda, uygulamanızdaki her HTTP istek yolunun (veya sayfasının) tek bir genel kullanıcının kimlik doğrulamasını gerektirmesini sağlar.

Bu çerçeve aynı zamanda son derece esnektir. Uygulamanızdaki her HTTP istek yolu ve farklı kullanıcılar için özelleştirilmiş güvenlik kuralları oluşturmanıza olanak tanır. Böylece kullanıcı yetkilendirmesi gerektirmeyen sayfalarda (ana sayfa gibi) güvenlik kısıtlamasını kaldırabilirsiniz. Ve belirli kullanıcı türlerinin rollerini ve yetkilerini ayarlayın.

Uygulamanıza Spring Security Ekleme

Spring Security'yi uygulamanıza eklemenin iki yolu vardır. Yeni bir Spring Boot uygulaması oluştururken bunu bir bağımlılık olarak seçebilirsiniz. Bahar başlatmayı kullanmaveya projenizi oluşturduktan sonra bağımlılık bölümünde yapı belirtim dosyanıza ekleyin.

instagram viewer

Gradle proje seçeneklerinden birini seçtiyseniz, bağımlılıklar dosyası build.gradle. Ancak, Maven'i seçerseniz, o zaman o dosya pom.xml.

Senin build.gradle dosya aşağıdaki bağımlılığı içermelidir:

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

senin p ikenom.xml dosya aşağıdaki bağımlılığı içermelidir:


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

Makalede kullanılan örnek uygulama bu makalede mevcuttur. GitHub deposu ve MIT lisansı altında ücretsiz olarak kullanabilirsiniz.

Spring Security'yi Kullanma

Uygulamanıza Spring Security bağımlılığını ekledikten sonra, çerçeveyi hemen kullanmaya başlayabilirsiniz. Uygulamanızı çalıştırın ve ardından Spring Boot'un ana sayfasına (veya uygulamanızdaki herhangi bir sayfaya) gidin. Örnek uygulama, Spring Boot'un varsayılanını kontrol etmek için aşağıdaki ilk denetleyiciyi kullanır. yerel ana bilgisayar: 8080 rica etmek:

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!";
}
}

Yukarıdaki tek denetleyici sınıfını ekledikten sonra uygulamanızı yürütmek, aşağıdaki ilk görünümü oluşturur:

sizi otomatik olarak yönlendirdiğini fark edeceksiniz. yerel ana bilgisayar: 8080/giriş sayfa ve bunu, uygulamanın herhangi bir başka sayfasına erişmenize izin vermeden önce yapar. Bu aşamada, varsayılan kullanıcı adını (kullanıcı olan) ve otomatik olarak oluşturulan şifreyi (konsolda bulacağınız) sağlamanız gerekir. Konsol aşağıdaki gibi bir satır üretecektir:

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

Uygulamanızı her yeniden başlattığınızda, otomatik olarak oluşturulan şifre değişecek, ancak kullanıcı adı aynı kalacaktır. Varsayılan kullanıcı adını ve şifreyi girmek, sizi uygulamanızda uygun görünüme yönlendirecektir.

Spring Security'yi Özelleştirme

Uygulama güvenliğinizi özelleştirmek için Spring Security'nin varsayılan yapılandırmasını geçersiz kılmanız gerekir. Ancak bundan önce (zaten Spring Web'e sahip olduğunuzu varsayarsak), bu örnek uygulama için birkaç başka bağımlılığa ihtiyacınız olacak:

  • Yay Verileri JPA
  • MySQL JDBC Sürücüsü
  • kekik yaprağı
  • Lombok

Thymeleaf çerçevesi farklı görünümler üretecektir. Lombok, nesne sınıflarınızdaki kodu azaltmaya yardımcı olacaktır. JPA kitaplığı ve MySQL sürücüsü, uygulama ile bir MySQL veritabanı kullanmanıza izin verir, ancak rahat olduğunuz herhangi bir veritabanını kullanma seçeneğiniz vardır. Bir veritabanı kullanmak, yapılandırmak anlamına gelir. uygulamalar.özellikler kaynaklar dosyasının altındaki dosya.

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

Yukarıdaki yapılandırma kodu, adı verilen yerel bir MySQL veritabanına bağlanmanıza izin verir. bahar_güvenliği, kullanıcı adı ile kök, ve şifre (1234). Veritabanı adınız ve kimlik bilgilerinizle eşleşmesi için bu verileri güncellemeniz gerekir.

Ek bağımlılıklarınızı ekledikten ve veritabanınızı oluşturduktan sonra, uygulamanızın kaç kez görüntüleneceğine karar vermeye başlayabilirsiniz. Ayrıca her sayfanın güvenliğinin nasıl olduğunu da bilmeniz gerekir. Örnek uygulamamız 6 görünüme sahiptir:

  • Ana Sayfa
  • Kayıt Sayfası
  • Giriş sayfası
  • Çıkış Sayfası
  • Kullanıcı Sayfası
  • Hatalı sayfa

Kullanıcı yetkilendirmesi gerektirecek tek görünüm kullanıcı sayfasıdır. Bu sayfaya yalnızca önce kaydolan, ardından uygulamada oturum açan kullanıcılar erişebilir. Spring Boot'un varsayılan paketine ek olarak, uygulamanızda dört paket daha oluşturmanız gerekir.

Kayıt Denetleyici Sınıfı

Denetleyici paketi, HTTP isteklerini işleyen sınıfları içerecektir. Bir sayfanın işlevine bağlı olarak, genellikle her bir HTTP isteğini bir denetleyici sınıfında gruplandırabilirsiniz. Web Denetleyicisi sınıf. Bununla birlikte, kayıt görünümünün daha benzersiz işlevleri vardır, bu nedenle özel bir denetleyici sınıfına sahip olabilir:

@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";
}
}

bu Kayıt Denetleyicisi class, uygulamanızın güvenlik yönüne açılan bir ağ geçididir. bu @RequestMapping ek açıklama, bu denetleyicinin işleyeceği istek türünü belirtir (istekler yerel ana bilgisayar: 8080/kayıt).

bu @GetMapping ek açıklama, uygulamanın bir istek alıp almadığını gösterir. /register, Kayıt formu() yöntem, kayıt görünümünü döndürerek bu isteği işlemelidir.

Bir ziyaretçi kayıt ol butonuna tıkladıktan sonra, @PostMapping açıklama devreye giriyor. bu işlemKayıt() yöntem, aldığı kullanıcı verilerini göndermenize olanak tanır. Kayıt formu sınıfı kullanarak veritabanına Kullanıcı Havuzu sınıf. Ancak bu verileri depolamadan önce, işlemKayıt() yöntemi kullanarak kullanıcının şifresini şifreler baharınŞifre Kodlayıcı arayüz.

Yeni Güvenlik Yapılandırmaları Oluşturma

Spring 3.1'den bu yana, geliştiriciler artık XML yerine sınıflar anlamına gelen Java kullanarak Spring Security için yapılandırmalar oluşturabilirler. Bu yapılandırma sınıflarının gerektirdiği ana şey, @Yapılandırma dipnot.

@Configuration
publicclassSecurityConfiguration{
}

bu @Yapılandırma ek açıklama, yukarıdaki sınıfın bir yapılandırma sınıfı olduğunu gösterir. Bu sınıflar, Bahar uygulama bağlamı, Spring'in bir uygulamanın farklı bileşenlerini (veya çekirdeklerini) oluşturmak ve yönetmek için kullandığı bir kapsayıcıdır. daki ilk fasulye Güvenlik Yapılandırması sınıf şifre Kodlayıcı fasulye.

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

bu Kayıt Denetleyicisi sınıf kullanır şifre Kodlayıcı bean yeni şifreleri veritabanına kaydetmeden önce kodlamak için. Eklemeniz gereken bir diğer önemli fasulye Güvenlik Yapılandırması sınıf kullanıcıAyrıntılarıHizmet fasulye.

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

bu kullanıcıAyrıntılarıHizmet fasulye istihdam Bahar GüvenliğiKullanıcıAyrıntılarıHizmet Bir müşterinin oturum açma oturumu sırasında kimlik doğrulaması için bir kullanıcının kullanıcı adını ve parolasını almak için arayüz. Böylece, bir müşteri oturum açma görünümünde oturum aç düğmesini tıkladığı anda, kullanıcıAyrıntılarıHizmet fasulye yayları harekete geçer.

İçinden Kullanıcı Havuzu, kullanıcıAyrıntılarıHizmet bean veritabanındaki tüm mevcut müşterilere erişim kazanır. Bu arabirim daha sonra Kullanıcı Havuzu eşleşen bir kullanıcı adı ve parolaya sahip bir kullanıcıyı bulmak için bu müşterinin tüm özelliklerini bir nesne olarak döndürür.

Döndürülen nesne bir müşteriyse, bu müşteri uygulamaya erişim kazanır. Aksi takdirde, sayfa otomatik olarak yenilenerek kullanıcının geçerli kimlik bilgileri girmesine olanak tanır.

Filtre Zinciri

Bahar GüvenliğiGüvenlik Filtresi Zinciri arayüz kullanışlı uygulama programlama arabirimi (API) Bu, Spring Security yapılandırmasında önemli bir rol oynar. Bu arayüz ile çalışır Bahar GüvenliğiHttpGüvenlik Belirli HTTP istekleri için bir filtre zinciri oluşturmak için sınıf.

@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();
}

bu filtre Zinciri Yukarıdaki fasulye kullanır Güvenlik Filtresi Zinciri Birkaç görevi gerçekleştirmek için API. İlk olarak, kullanır HttpGüvenlik yalnızca KULLANICI rolüne sahip kullanıcıların erişebileceğini belirtmek için sınıf yerel ana bilgisayar: 8080/kullanıcı. Ve bir kullanıcı, kayıt olduktan sonra bu rolü alır. getAuthorities() her yeni müşteri nesnesinin uyguladığı yöntem.

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

Filtre zinciri, uygulamadaki diğer tüm URL'lere kimliği doğrulanmamış erişim sağlar. bu filtre Zinciri fasulye de kullanır formLogin() Ve çıkış Yap() yöntemleri HttpGüvenlik sınıf nesnesi.

Bu yöntemler, bir kullanıcıyı bir görevi gerçekleştirdikten sonra otomatik olarak belirli sayfalara yönlendirmenizi sağlar. Böylece, doğru kimlik bilgilerini giren ve giriş düğmesine tıklayan bir kullanıcı /login sayfa otomatik olarak şuraya yönlendirilecektir: /user sayfa.

Son olarak, filtre Zinciri bean, yetkili kullanıcıların uygulamaya erişmesine izin veren filtre zincirini oluşturur ve döndürür. Her üç fasulye de Güvenlik Yapılandırması sınıf, uygulamanızın güvenliğini sağlamak için birlikte çalışır.

Ancak filtre Zinciri bean, yetkilendirme düzeyini dikte etmede daha önemli bir rol oynar. her HTTP isteği. Uygulamanıza daha fazla sayfa eklemeye başladığınızda, filtre Zinciri fasulye güvenlik seviyelerini ayarlamak için.

Yay Güvenliğinin Başlıca Faydası

Spring Security, yalnızca uygulamanıza kimlerin erişebileceğini değil, aynı zamanda bir kullanıcının sahip olabileceği erişim türünü (kullanıcı rolleri özelliği aracılığıyla) tam olarak kontrol etmenizi sağlar. Erişim kontrolü, herhangi bir uygulamanın en önemli yönlerinden biridir. Sınırlı erişim kontrolü engelleri nedeniyle genel kullanıcılara uygulamanıza filtrelenmemiş erişim vermek, maliyetli bir hata olabilir.