برنامه نویسی

فرم ورود با چکمه بهار و آویشن

Summarize this content to 400 words in Persian Lang
ورود مبتنی بر فرم اغلب عبارت است از اولین انتخاب برای محافظت از صفحه وب یک برنامه Spring Boot. این تضمین می کند که مناطق خاصی از برنامه ما فقط زمانی قابل دسترسی است که کاربر خود را با نام کاربری و رمز عبور احراز هویت کند و این وضعیت در جلسه ذخیره می شود. برای افزودن لاگین مبتنی بر فرم به برنامه Spring Boot ما چه مراحلی لازم است؟

با یک برنامه ساده شروع کنید

ابتدا از Bootify Builder برای ایجاد یک برنامه ساده Spring Boot در نسخه فعلی 3.3.2 – برای انجام این کار، به سادگی بر روی open project کلیک می کنیم. در آنجا ما انتخاب می کنیم Thymeleaf + Bootstrap به عنوان پشته frontend – Thymeleaf پر استفاده ترین موتور قالب Spring Boot است و اجازه رندر سمت سرور را می دهد. بوت استرپ به عنوان WebJar در برنامه ما ادغام خواهد شد. هر پایگاه داده ای را که می خواهید به آن متصل شوید انتخاب کنید – یک پایگاه داده تعبیه شده در حال حاضر نیز این کار را انجام می دهد.

در برگه نهادها جداول را ایجاد می کنیم User همچنین TodoList، و آنها را با یک وصل کنید N:1 رابطه برای TodoList گزینه CRUD را برای frontend فعال می کنیم – این منطقه ای خواهد بود که پس از آن با Spring Security ایمن می کنیم.

پیش نمایش طرحواره پایگاه داده بسیار ساده ما

اکنون می توانیم برنامه تمام شده را دانلود کرده و آن را به IDE مورد علاقه خود وارد کنیم.

اولین نسخه برنامه ما در IntelliJ

پیکربندی Spring Security

ورود مبتنی بر فرم با کمک Spring Security ارائه شده است. بنابراین ما ابتدا به وابستگی های مربوطه نیاز داریم که به خود اضافه می کنیم build.gradle یا pom.xml به ترتیب.

implementation(‘org.springframework.boot:spring-boot-starter-security’)
implementation(‘org.thymeleaf.extras:thymeleaf-extras-springsecurity6’)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول spring-boot-starter-security Spring Security را ادغام می کند. با thymeleaf-extras-springsecurity6 یک کمک کننده کوچک گنجانده شده است که وضعیت احراز هویت را در قالب های Thymeleaf ما ارائه می دهد – در ادامه در مورد آن بیشتر توضیح خواهیم داد.

با این ما می توانیم در حال حاضر پیکربندی امنیتی مرکزی را ارائه می دهد – اینجا به طور مستقیم در نسخه نهایی ما.

@Configuration
@EnableMethodSecurity(prePostEnabled = true)
public class HttpSecurityConfig {

@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

@Bean
public AuthenticationManager authenticationManager(
final AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}

@Bean
public SecurityFilterChain configure(final HttpSecurity http) throws Exception {
return http.cors(withDefaults())
.csrf(withDefaults())
.authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
.formLogin(form -> form
.loginPage(“/login”)
.usernameParameter(“email”)
.failureUrl(“/login?loginError=true”))
.logout(logout -> logout
.logoutSuccessUrl(“/login?logoutSuccess=true”)
.deleteCookies(“JSESSIONID”))
.exceptionHandling(exception -> exception
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint(“/login?loginRequired=true”)))
.build();
}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیکربندی ما برای ورود به فرم

از لحاظ تئوری، Spring Security می‌تواند فرم ورود به سیستم را با پیکربندی کمتری ارائه دهد، اما فاقد طراحی و برخی از پیام‌هایی است که می‌خواهیم به کاربر ارائه دهیم. اما اجازه دهید ابتدا تنظیمات را مرور کنیم.

BCryptPasswordEncoder امروزه استاندارد است برای ذخیره هش یک رمز عبور همراه با نمک جداگانه آن داخل یک میدان واحد اگر نیازی به میراث نداریم، باید از این مورد استفاده کنیم. همچنین، ما ارائه می دهیم AuthenticationManager به عنوان یک لوبیا تا بتوان آن را در سایر خدمات ادغام کرد.

به عنوان لوبیا سوم ما ایجاد می کنیم SecurityFilterChain زیرا این رویکرد مورد نیاز از بهار 3.0 است. ما باید CORS و CSRF را به درستی پیکربندی کنیم تا بردارهای حمله مربوطه را ببندیم. پیکربندی پیش فرض معمولا برای این کار کافی است.

در کلاس پیکربندی خود، حاشیه نویسی را قرار داده ایم @EnableMethodSecurity و از نقاط انتهایی کنترلر مورد نظر محافظت می کند @PreAuthorize(…) بعد ها. از این رو ما اجازه دسترسی به کل برنامه را می دهیم با permitAll(). بدون امنیت مبتنی بر حاشیه نویسی، ما باید مسیرهای منابع محافظت شده را در این مکان نیز پیکربندی کنیم.

این formLogin() و logout() روش ها برای کنترل کننده بعدی ما سفارشی شده اند تا بتوانیم همیشه یک پیام مناسب به کاربر نمایش دهد. Spring Security به طور خودکار یک نقطه پایانی برای ورود به سیستم فراهم می کند که نام کاربری و رمز عبور را می توان از طریق درخواست POST ارسال کرد. در اینجا نام فیلد نام کاربری را به تغییر می دهیم “email”. خروج از سیستم برای تغییر مسیر مجدد به صفحه ورود با یک پارامتر پس از آن تغییر می کند.

بارگیری کاربران از پایگاه داده ما

برای بارگیری کاربران از جدولی که از قبل ایجاد شده است، باید پیاده سازی را ارائه دهیم UserDetailsService به عنوان یک لوبیا – خواهد شد به طور خودکار پیدا شده و به عنوان منبع کاربر استفاده می شود.

@Service
public class HttpUserDetailsService implements UserDetailsService {

private final UserRepository userRepository;

public HttpUserDetailsService(final UserRepository userRepository) {
this.userRepository = userRepository;
}

@Override
public HttpUserDetails loadUserByUsername(final String username) {
final User user = userRepository.findByEmailIgnoreCase(username);
if (user == null) {
log.warn(“user not found: {}”, username);
throw new UsernameNotFoundException(“User ” + username + ” not found”);
}
final ListSimpleGrantedAuthority> roles = Collections.singletonList(new SimpleGrantedAuthority(“ROLE_USER”));
return new HttpUserDetails(user.getId(), username, user.getHash(), roles);
}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیاده سازی UserDetailsService به طور خودکار به عنوان منبع کاربر استفاده می شود

در مخزن ما باید یک متد اضافه کنیم User findByEmailIgnoreCase(String email) برای اجرای یک پرس و جو در برابر پایگاه داده – نادیده گرفتن حروف بزرگ/کوچک به کاربر اجازه می دهد هنگام نوشتن ایمیل خود اشتباهات کوچکی داشته باشد. نقش اینجا همیشه است ROLE_USER برای هر کاربر از آنجایی که در این مرحله نقطه پایانی ثبت نام در دسترس نداریم، می‌توانیم در حال حاضر یک بارکننده داده ساده به همراه برنامه خود اضافه کنیم. نمایه “local” برای فعال شدن آن لازم است.

@Component
@Profile(“local”)
public class UserLoader implements ApplicationRunner {

private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;

public UserLoader(final UserRepository userRepository,
final PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}

@Override
public void run(final ApplicationArguments args) {
if (userRepository.count() != 0) {
return;
}
final User user = new User();
user.setEmail(“test@test.com”);
user.setHash(passwordEncoder.encode(“testtest”));
userRepository.save(user);
}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلاس کمکی برای مقداردهی اولیه کاربر اول به صورت محلی

اضافه کردن کنترل کننده ورود

با این ما از قبل می توانیم اضافه کنیم LoginController. از آنجایی که نقطه پایانی POST به طور خودکار توسط Spring Security ارائه می شود، یک نقطه پایانی GET در اینجا برای نشان دادن الگو به کاربر کافی است.

@Controller
public class AuthenticationController {

@GetMapping(“/login”)
public String login(@RequestParam(name = “loginRequired”, required = false) final Boolean loginRequired,
@RequestParam(name = “loginError”, required = false) final Boolean loginError,
@RequestParam(name = “logoutSuccess”, required = false) final Boolean logoutSuccess,
final Model model) {
model.addAttribute(“authentication”, new AuthenticationRequest());
if (loginRequired == Boolean.TRUE) {
model.addAttribute(WebUtils.MSG_INFO, WebUtils.getMessage(“authentication.login.required”));
}
if (loginError == Boolean.TRUE) {
model.addAttribute(WebUtils.MSG_ERROR, WebUtils.getMessage(“authentication.login.error”));
}
if (logoutSuccess == Boolean.TRUE) {
model.addAttribute(WebUtils.MSG_INFO, WebUtils.getMessage(“authentication.logout.success”));
}
return “authentication/login”;
}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Backend برای ارائه صفحه ورود به سیستم

این پارامترهای درخواستی که قبلاً در پیکربندی امنیتی خود مشخص کرده بودیم در اینجا به پیام های مربوطه تبدیل می شوند. در برنامه ساده ما از Bootify، کمک های مربوطه قبلاً گنجانده شده است. در اینجا ما نیز به آن نیاز داریم AuthenticationRequest شیء با گیرنده و تنظیم کننده.

public class AuthenticationRequest {

@NotNull
@Size(max = 255)
private String email;

@NotNull
@Size(max = 255)
private String password;

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قالب مربوطه برای کنترلر ما می تواند به این شکل باشد.

xmlns:th=”http://www.thymeleaf.org” xmlns:layout=”http://www.ultraq.net.nz/thymeleaf/layout”
layout:decorate=”~{layout}”>

[[#{authentication.login.headline}]]

layout:fragment=”content”>

th:replace=”~{fragments/forms::globalErrors(‘authentication’)}” />
th:action=”${requestUri}” method=”post”>

As Thymeleaf doesn’t allow direct access to request object anymore, we’re providing the requestUri in the model.

@ModelAttribute(“requestUri”)
String getRequestServletPath(final HttpServletRequest request) {
return request.getRequestURI();
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

_ ارائه requestUri – به عنوان بخشی از AuthenticationController یا یک ControllerAdvice کلی _

با این الگو ما یک درخواست POST به /login نقطه پایانی پیام های INFO یا ERROR به طور خودکار توسط طرح نمایش داده می شوند. همه پیام های استفاده شده باید در ما وجود داشته باشد messages.properties.

authentication.login.headline=Login
authentication.email.label=Email
authentication.password.label=Password
authentication.login.required=Please login to access this area.
authentication.login.error=Your login was not successful – please try again.
authentication.logout.success=Your logout was successful.
navigation.login=Login
navigation.logout=Logout

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آخرین ما می توانیم خود را تمدید کنیم layout.html. با این کار ما همیشه یک پیوند ورود/خروج در هدر نشان می دهیم. Spring Security نیز به صورت خودکار یک /logout نقطه پایانی، اما باید از طریق POST به آن رسیدگی کنیم.

افزودن پیوندهای ورود / خروج به طرح ما

در html تگ ما فضای نام را گسترش داده ایم تا از کمک کننده ها استفاده کنیم thymeleaf-extras-springsecurity6 مدول. به عنوان آخرین مرحله، فقط باید حاشیه نویسی را اضافه کنیم @PreAuthorize(“hasAuthority(‘ROLE_USER’)”) تور TodoListController.

شروع برنامه ما

با این همه ما به تکه هایی از پازل خود با هم نیاز داریم! اکنون اپلیکیشن خود را شروع می کنیم و زمانی که می خواهیم لیست های کار را ببینیم، باید به صفحه ورود هدایت شویم. در اینجا می توانیم با آن وارد شوید test@test.com / testtest.

تغییر مسیر خودکار به ورود

در طرح رایگان Bootify، نمونه اولیه Spring Boot با طرح پایگاه داده خود، REST API و frontend می تواند تولید شود. در طرح حرفه ای، از جمله، امنیت Spring با ورود بر اساس فرم در دسترس است برای ایجاد تنظیماتی که در اینجا توضیح داده شده است – دقیقاً مطابق با پایگاه داده ایجاد شده و تنظیمات انتخاب شده است. یک نقطه پایانی ثبت نام و منبع نقش نیز می تواند مشخص شود.

» به ویژگی ها و قیمت گذاری مراجعه کنید

در ادامه بخوانید

مرگ DevSecOps، قسمت 3

رایان کارترایت – 5 جولای

تبدیل کد با آمازون Q

مت لوئیس – 9 جولای

پیاده سازی Autosize Textarea در React: راهنمای کامل

poshiya parth s – 9 جولای

ذخیره عناصر جزئی HTML در فایل های جداگانه؟

مارکوس_- 4 جولای

ورود مبتنی بر فرم اغلب عبارت است از اولین انتخاب برای محافظت از صفحه وب یک برنامه Spring Boot. این تضمین می کند که مناطق خاصی از برنامه ما فقط زمانی قابل دسترسی است که کاربر خود را با نام کاربری و رمز عبور احراز هویت کند و این وضعیت در جلسه ذخیره می شود. برای افزودن لاگین مبتنی بر فرم به برنامه Spring Boot ما چه مراحلی لازم است؟

با یک برنامه ساده شروع کنید

ابتدا از Bootify Builder برای ایجاد یک برنامه ساده Spring Boot در نسخه فعلی 3.3.2 – برای انجام این کار، به سادگی بر روی open project کلیک می کنیم. در آنجا ما انتخاب می کنیم Thymeleaf + Bootstrap به عنوان پشته frontend – Thymeleaf پر استفاده ترین موتور قالب Spring Boot است و اجازه رندر سمت سرور را می دهد. بوت استرپ به عنوان WebJar در برنامه ما ادغام خواهد شد. هر پایگاه داده ای را که می خواهید به آن متصل شوید انتخاب کنید – یک پایگاه داده تعبیه شده در حال حاضر نیز این کار را انجام می دهد.

در برگه نهادها جداول را ایجاد می کنیم User همچنین TodoList، و آنها را با یک وصل کنید N:1 رابطه برای TodoList گزینه CRUD را برای frontend فعال می کنیم – این منطقه ای خواهد بود که پس از آن با Spring Security ایمن می کنیم.

simpleSchemaPreview
پیش نمایش طرحواره پایگاه داده بسیار ساده ما

اکنون می توانیم برنامه تمام شده را دانلود کرده و آن را به IDE مورد علاقه خود وارد کنیم.

intellijAfterImport
اولین نسخه برنامه ما در IntelliJ

پیکربندی Spring Security

ورود مبتنی بر فرم با کمک Spring Security ارائه شده است. بنابراین ما ابتدا به وابستگی های مربوطه نیاز داریم که به خود اضافه می کنیم build.gradle یا pom.xml به ترتیب.

implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.thymeleaf.extras:thymeleaf-extras-springsecurity6')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول spring-boot-starter-security Spring Security را ادغام می کند. با thymeleaf-extras-springsecurity6 یک کمک کننده کوچک گنجانده شده است که وضعیت احراز هویت را در قالب های Thymeleaf ما ارائه می دهد – در ادامه در مورد آن بیشتر توضیح خواهیم داد.

با این ما می توانیم در حال حاضر پیکربندی امنیتی مرکزی را ارائه می دهد – اینجا به طور مستقیم در نسخه نهایی ما.

@Configuration
@EnableMethodSecurity(prePostEnabled = true)
public class HttpSecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManager(
            final AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public SecurityFilterChain configure(final HttpSecurity http) throws Exception {
        return http.cors(withDefaults())
                .csrf(withDefaults())
                .authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll())
                .formLogin(form -> form
                    .loginPage("/login")
                    .usernameParameter("email")
                    .failureUrl("/login?loginError=true"))
                .logout(logout -> logout
                    .logoutSuccessUrl("/login?logoutSuccess=true")
                    .deleteCookies("JSESSIONID"))
                .exceptionHandling(exception -> exception
                    .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login?loginRequired=true")))
                .build();
    }

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیکربندی ما برای ورود به فرم

از لحاظ تئوری، Spring Security می‌تواند فرم ورود به سیستم را با پیکربندی کمتری ارائه دهد، اما فاقد طراحی و برخی از پیام‌هایی است که می‌خواهیم به کاربر ارائه دهیم. اما اجازه دهید ابتدا تنظیمات را مرور کنیم.

BCryptPasswordEncoder امروزه استاندارد است برای ذخیره هش یک رمز عبور همراه با نمک جداگانه آن داخل یک میدان واحد اگر نیازی به میراث نداریم، باید از این مورد استفاده کنیم. همچنین، ما ارائه می دهیم AuthenticationManager به عنوان یک لوبیا تا بتوان آن را در سایر خدمات ادغام کرد.

به عنوان لوبیا سوم ما ایجاد می کنیم SecurityFilterChain زیرا این رویکرد مورد نیاز از بهار 3.0 است. ما باید CORS و CSRF را به درستی پیکربندی کنیم تا بردارهای حمله مربوطه را ببندیم. پیکربندی پیش فرض معمولا برای این کار کافی است.

در کلاس پیکربندی خود، حاشیه نویسی را قرار داده ایم @EnableMethodSecurity و از نقاط انتهایی کنترلر مورد نظر محافظت می کند @PreAuthorize(...) بعد ها. از این رو ما اجازه دسترسی به کل برنامه را می دهیم با permitAll(). بدون امنیت مبتنی بر حاشیه نویسی، ما باید مسیرهای منابع محافظت شده را در این مکان نیز پیکربندی کنیم.

این formLogin() و logout() روش ها برای کنترل کننده بعدی ما سفارشی شده اند تا بتوانیم همیشه یک پیام مناسب به کاربر نمایش دهد. Spring Security به طور خودکار یک نقطه پایانی برای ورود به سیستم فراهم می کند که نام کاربری و رمز عبور را می توان از طریق درخواست POST ارسال کرد. در اینجا نام فیلد نام کاربری را به تغییر می دهیم "email". خروج از سیستم برای تغییر مسیر مجدد به صفحه ورود با یک پارامتر پس از آن تغییر می کند.

بارگیری کاربران از پایگاه داده ما

برای بارگیری کاربران از جدولی که از قبل ایجاد شده است، باید پیاده سازی را ارائه دهیم UserDetailsService به عنوان یک لوبیا – خواهد شد به طور خودکار پیدا شده و به عنوان منبع کاربر استفاده می شود.

@Service
public class HttpUserDetailsService implements UserDetailsService {

    private final UserRepository userRepository;

    public HttpUserDetailsService(final UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public HttpUserDetails loadUserByUsername(final String username) {
        final User user = userRepository.findByEmailIgnoreCase(username);
        if (user == null) {
            log.warn("user not found: {}", username);
            throw new UsernameNotFoundException("User " + username + " not found");
        }
        final ListSimpleGrantedAuthority> roles = Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"));
        return new HttpUserDetails(user.getId(), username, user.getHash(), roles);
    }

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پیاده سازی UserDetailsService به طور خودکار به عنوان منبع کاربر استفاده می شود

در مخزن ما باید یک متد اضافه کنیم User findByEmailIgnoreCase(String email) برای اجرای یک پرس و جو در برابر پایگاه داده – نادیده گرفتن حروف بزرگ/کوچک به کاربر اجازه می دهد هنگام نوشتن ایمیل خود اشتباهات کوچکی داشته باشد. نقش اینجا همیشه است ROLE_USER برای هر کاربر از آنجایی که در این مرحله نقطه پایانی ثبت نام در دسترس نداریم، می‌توانیم در حال حاضر یک بارکننده داده ساده به همراه برنامه خود اضافه کنیم. نمایه "local" برای فعال شدن آن لازم است.

@Component
@Profile("local")
public class UserLoader implements ApplicationRunner {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    public UserLoader(final UserRepository userRepository,
                      final PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public void run(final ApplicationArguments args) {
        if (userRepository.count() != 0) {
            return;
        }
        final User user = new User();
        user.setEmail("test@test.com");
        user.setHash(passwordEncoder.encode("testtest"));
        userRepository.save(user);
    }

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلاس کمکی برای مقداردهی اولیه کاربر اول به صورت محلی

اضافه کردن کنترل کننده ورود

با این ما از قبل می توانیم اضافه کنیم LoginController. از آنجایی که نقطه پایانی POST به طور خودکار توسط Spring Security ارائه می شود، یک نقطه پایانی GET در اینجا برای نشان دادن الگو به کاربر کافی است.

@Controller
public class AuthenticationController {

    @GetMapping("/login")
    public String login(@RequestParam(name = "loginRequired", required = false) final Boolean loginRequired,
            @RequestParam(name = "loginError", required = false) final Boolean loginError,
            @RequestParam(name = "logoutSuccess", required = false) final Boolean logoutSuccess,
            final Model model) {
        model.addAttribute("authentication", new AuthenticationRequest());
        if (loginRequired == Boolean.TRUE) {
            model.addAttribute(WebUtils.MSG_INFO, WebUtils.getMessage("authentication.login.required"));
        }
        if (loginError == Boolean.TRUE) {
            model.addAttribute(WebUtils.MSG_ERROR, WebUtils.getMessage("authentication.login.error"));
        }
        if (logoutSuccess == Boolean.TRUE) {
            model.addAttribute(WebUtils.MSG_INFO, WebUtils.getMessage("authentication.logout.success"));
        }
        return "authentication/login";
    }

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Backend برای ارائه صفحه ورود به سیستم

این پارامترهای درخواستی که قبلاً در پیکربندی امنیتی خود مشخص کرده بودیم در اینجا به پیام های مربوطه تبدیل می شوند. در برنامه ساده ما از Bootify، کمک های مربوطه قبلاً گنجانده شده است. در اینجا ما نیز به آن نیاز داریم AuthenticationRequest شیء با گیرنده و تنظیم کننده.

public class AuthenticationRequest {

    @NotNull
    @Size(max = 255)
    private String email;

    @NotNull
    @Size(max = 255)
    private String password;

}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قالب مربوطه برای کنترلر ما می تواند به این شکل باشد.


 xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
        layout:decorate="~{layout}">
    
        </span>[[#{authentication.login.headline}]]<span class="nt"/>
    <span class="nt"/>
    <span class="nt"/>
        <span class="nt"><div> <span class="na">layout:fragment=</span><span class="s">"content"</span><span class="nt">></span>
            <span class="nt"/>
            <span class="nt"><div> <span class="na">th:replace=</span><span class="s">"~{fragments/forms::globalErrors('authentication')}"</span> <span class="nt">/></span>
            <span class="nt"><form> <span class="na">th:action=</span><span class="s">"${requestUri}"</span> <span class="na">method=</span><span class="s">"post"</span><span class="nt">></span>
                <span class="nt">



<p>As Thymeleaf doesn't allow direct access to request object anymore, we're providing the <code>requestUri</code> in the model.<br/></p>

<div class="highlight js-code-highlight">
<pre class="highlight java"><code><span class="nd">@ModelAttribute</span><span class="o">(</span><span class="s">"requestUri"</span><span class="o">)</span>
<span class="nc">String</span> <span class="nf">getRequestServletPath</span><span class="o">(</span><span class="kd">final</span> <span class="nc">HttpServletRequest</span> <span class="n">request</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">return</span> <span class="n">request</span><span class="o">.</span><span class="na">getRequestURI</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    <svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-on"><title>وارد حالت تمام صفحه شوید
    

از حالت تمام صفحه خارج شوید

_ ارائه requestUri - به عنوان بخشی از AuthenticationController یا یک ControllerAdvice کلی _

با این الگو ما یک درخواست POST به /login نقطه پایانی پیام های INFO یا ERROR به طور خودکار توسط طرح نمایش داده می شوند. همه پیام های استفاده شده باید در ما وجود داشته باشد messages.properties.

authentication.login.headline=Login
authentication.email.label=Email
authentication.password.label=Password
authentication.login.required=Please login to access this area.
authentication.login.error=Your login was not successful - please try again.
authentication.logout.success=Your logout was successful.
navigation.login=Login
navigation.logout=Logout
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آخرین ما می توانیم خود را تمدید کنیم layout.html. با این کار ما همیشه یک پیوند ورود/خروج در هدر نشان می دهیم. Spring Security نیز به صورت خودکار یک /logout نقطه پایانی، اما باید از طریق POST به آن رسیدگی کنیم.

افزودن پیوندهای ورود / خروج به طرح ما

در html تگ ما فضای نام را گسترش داده ایم تا از کمک کننده ها استفاده کنیم thymeleaf-extras-springsecurity6 مدول. به عنوان آخرین مرحله، فقط باید حاشیه نویسی را اضافه کنیم @PreAuthorize("hasAuthority('ROLE_USER')") تور TodoListController.

شروع برنامه ما

با این همه ما به تکه هایی از پازل خود با هم نیاز داریم! اکنون اپلیکیشن خود را شروع می کنیم و زمانی که می خواهیم لیست های کار را ببینیم، باید به صفحه ورود هدایت شویم. در اینجا می توانیم با آن وارد شوید test@test.com / testtest.

loginRedirect
تغییر مسیر خودکار به ورود

در طرح رایگان Bootify، نمونه اولیه Spring Boot با طرح پایگاه داده خود، REST API و frontend می تواند تولید شود. در طرح حرفه ای، از جمله، امنیت Spring با ورود بر اساس فرم در دسترس است برای ایجاد تنظیماتی که در اینجا توضیح داده شده است - دقیقاً مطابق با پایگاه داده ایجاد شده و تنظیمات انتخاب شده است. یک نقطه پایانی ثبت نام و منبع نقش نیز می تواند مشخص شود.

» به ویژگی ها و قیمت گذاری مراجعه کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا