مشخصات مقاله
-
469
-
0.0
-
1853
-
0
-
0
آموزش ذخیره اطلاعات در پایگاه داده در Spring Security
Remember me امنیت Spring
Remember me (RM) در امنیت Spring
RM یک ویژگی است که به کاربر اجازه دسترسی به برنامه را بدون ورود مجدد می دهد. دوره ورود کاربر پس از بستن مرورگر به اتمام می رسد و اگر کاربر مجددا با باز کردن مرورگر قصد دسترسی به برنامه را داشته باشد، درخواست ورود فعال می شود. اما می توان با استفاده از ویژگی RM از این ورود مجدد جلوگیری کرد. RM هویت کاربر را در کوکی (Cookie) یا پایگاه داده ذخیره می کند و از آن برای شناسایی کاربر استفاده می کند. این ویژگی را در مثال زیر پیاده سازی می کنیم. مثال را با هم می بینیم.
یک پروژه maven ایجاد کنید. یک پروژه maven با جزییات پروژه ایجاد کنید.
پروژه در ابتدا به این شکل است.
پیکربندی امنیت Spring
پروژه را برای پیاده سازی امنیت Spring پیکربندی کنید. پروژه به چهار فایل جاوای زیر احتیاج دارد. ابتدا پکیج com.javatpoint را ایجاد کنید و همه فایل ها را در آن قرار دهید.
// AppConfig.java
package com.javatpoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@EnableWebMvc
@Configuration
@ComponentScan({ "com.javatpoint.controller.*" })
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver
= new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
// MvcWebApplicationInitializer.java
package com.javatpoint;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MvcWebApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class>[] getRootConfigClasses() {
return new Class[] { WebSecurityConfig.class };
}
@Override
protected Class>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
// SecurityWebApplicationInitializer.java
package com.javatpoint;
import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}
// WebSecuiryConfig.java
در این کلاس، ایجاد کاربر و احراز هویت آن انجام می شود. متد rememberMe() درون متد configure() مسئول ذخیره و به یاد داشتن هویت کاربر است.
package com.javatpoint;
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.core.userdetails.*;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@EnableWebSecurity
@ComponentScan("com.javatpoint")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder()
.username("admin").password("admin123").roles("ADMIN").build());
return manager;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().
antMatchers("/index", "/user","/").permitAll()
.antMatchers("/admin").authenticated()
.and()
.formLogin()
.loginPage("/login")
.and()
.rememberMe()
.key("rem-me-key")
.rememberMeParameter("remember") // it is name of checkbox at login page
.rememberMeCookieName("rememberlogin") // it is name of the cookie
.tokenValiditySeconds(100) // remember for number of seconds
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}
}
کنترلر
یک کنترلر HomeController درون پکیج com.javatpoint.controller ایجاد کنید. کد کنترلر را ببینیم.
// HomeController.java
package com.javatpoint.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
return "login";
}
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String admin() {
return "admin";
}
}
منظر ها (views)
منظر (صفحات JSP) را برای تولید خروجی در مرورگر، ایجاد کنید.
// index.jsp
< html> < head> < title>Home Page< /title> < /head> < body> Welcome to Javatpoint! < br> < br> < a href="admin">Admin login< /a> < /body> < /html>
// admin.jsp
< html> < head> < meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> < title>Home Page< /title> < /head> < body> Welcome Admin! ? < a href="logout">logout< /a> < /body> < /html>
// login.jsp
این صفحه ورود سفارشی ماست که در آن جعبه گزینه RM را اضافه کردیم. کد را ببینیم.
<%@ taglib
prefix="c"
uri="http://java.sun.com/jsp/jstl/core"
%>
< c:url value="/login" var="loginUrl" />
< form action="$ {loginUrl}" method="post">
< c:if test="$ {param.error != null}">
< p>
Invalid username and password.
< /p>
< /c:if>
< c:if test="$ {param.logout != null}">
< p>
You have been logged out.
< /p>
< /c:if>
< p>
< label for="username">Username< /label>
< input type="text" id="username" name="username" />
< /p>
< p>
< label for="password">Password< /label>
< input type="password" id="password" name="password" />
< /p>
< p>
< label for="remember"> Remember me< /label>
< input type="checkbox" name="remember" />
< /p>
< input type="hidden"
30. name="$ {_csrf.parameterName}"
31. value="$ {_csrf.token}" />
< button type="submit" class="btn">Log in< /button>
< /form>
وابستگی های پروژه
فایل pom.xml در ادامه قرار دارد که شامل همه وابستگی های مورد نیاز است.
// pom.xml
< project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
< modelVersion>4.0.0< /modelVersion>
< groupId>com.javatpoint< /groupId>
< artifactId>springrememberme< /artifactId>
< version>0.0.1-SNAPSHOT< /version>
< packaging>war< /packaging>
< properties>
< maven.compiler.target>1.8< /maven.compiler.target>
< maven.compiler.source>1.8< /maven.compiler.source>
< /properties>
< dependencies>
< dependency>
< groupId>org.springframework< /groupId>
< artifactId>spring-webmvc< /artifactId>
< version>5.0.2.RELEASE< /version>
< /dependency>
< dependency>
< groupId>org.springframework.security< /groupId>
< artifactId>spring-security-web< /artifactId>
< version>5.0.0.RELEASE< /version>
< /dependency>
< dependency>
< groupId>org.springframework.security< /groupId>
< artifactId>spring-security-core< /artifactId>
< version>5.0.4.RELEASE< /version>
< /dependency>
< !-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
< dependency>
< groupId>org.springframework.security< /groupId>
< artifactId>spring-security-config< /artifactId>
< version>5.0.4.RELEASE< /version>
< /dependency>
< !-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
< dependency>
< groupId>javax.servlet< /groupId>
< artifactId>javax.servlet-api< /artifactId>
< version>3.1.0< /version>
< scope>provided< /scope>
< /dependency>
< dependency>
< groupId>javax.servlet< /groupId>
< artifactId>jstl< /artifactId>
< version>1.2< /version>
< /dependency>
< /dependencies>
< build>
< plugins>
< plugin>
< groupId>org.apache.maven.plugins< /groupId>
< artifactId>maven-war-plugin< /artifactId>
< version>2.6< /version>
< configuration>
< failOnMissingWebXml>false< /failOnMissingWebXml>
< /configuration>
< /plugin>
< /plugins>
< /build>
< /project>
ساختار پروژه
پس از اضافه کردن همه فایل ها، ساختار پروژه به این شکل می شود.
سرور را اجرا کنید.
خروجی :
روی لینک ورود ادمین کلیک کنید و وارد شوید.
ببینید روی جعبه گزینه remember me کلیک کردیم.
URL http ://localhost:8080/springrememberme/admin را کپی کنید و مرورگر را کاملا ببندید. پس از یک ثانیه مرورگر را باز کنید و URL کپی شده را وارد کنید.
ببینید! برای ورود درخواست نکرد و ما را به همان صفحه برد. زیرا ما گزینه remember me را هنگام ورود انتخاب کرده بودیم.