SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面

SpringSecurity的简单概述

是什么:SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案;提供全面的安全服务
有什么用:可以进行身份验证,就是证明你是谁;也可以进行授权,就是你可以做什么

配置SpringSecurity的默认登录页面

  1. 搭建SpringSecurity环境
    创建maven项目后,添加security-pom依赖
	<!-- springboot项目都要继承boot父工程-->
 	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>
	
    <properties>
    	<!-- 配置jdk版本 -->
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
		<!-- 加入web相关的jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		
		<!--以下为security需要的依赖包-->
		<!--web安全模块-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>

        </dependency>
        
        <!--java配置模块-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
        </dependency>
        
        <!-- 标签库 -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
        </dependency>

    </dependencies>
  1. 此时运行启动类(Application),页面显示如下登录页面(不同版本页面可能不同),说明SpringSecurity配置成功

    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第1张图片

  2. 加入SpringSecurityConfig配置类(SpringSecurity的配置基本都写在此类中)
    在这里插入图片描述

  3. 给SpringSecurityConfig类添加@SpringBootConfiguration和@EnableWebSecurity注释,继承WebSecurityConfigurerAdapter类,并重写configure(HttpSecurity http)方法

	@Configuration
	@EnableWebSecurity
	public class AppWebSecurityConfig extends WebSecurityConfigurerAdapter {
		@Override
	    protected void configure(HttpSecurity http) throws Exception {
	            //super.configure(http);//默认所有资源不放行,所以注释掉
	}
  1. 运行启动类,发现所有接口和静态页面都可以访问了,不在出现SpringSecurity提供的默认页面(注意:需要把配置类中:super.configure(http)注释掉才生效)

  2. 现在,对我们的页面和静态资源进行授权

    @Configuration
    @EnableWebSecurity
    public class AppWebSecurityConfig extends WebSecurityConfigurerAdapter {
    	@Override
        protected void configure(HttpSecurity http) throws Exception {
                //super.configure(http);//默认所有资源不放行,所以注释掉
    +		http.authorizeRequests().antMatchers("/css/**", "/login.html","/main").permitAll()//设置匹配的资源放行
    +              .anyRequest().authenticated();//剩余任何资源必须认证
    }
    
  3. 现在去访问这些已放行的页面或接口都没问题,没放行的都访问不了(显示如下)
    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第2张图片

  4. 我们一般访问没有认证的页面时应该是跳转到登录页面的,而不是出现如上页面,所以我们应该自定义一个登录页面,修改配置类

    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第3张图片

	@Configuration
	@EnableWebSecurity
	public class AppWebSecurityConfig extends WebSecurityConfigurerAdapter {
		@Override
	    protected void configure(HttpSecurity http) throws Exception {
	            //super.configure(http);//默认所有资源不放行,所以注释掉
			http.authorizeRequests().antMatchers("/css/**", "/login.html","/main").permitAll()//设置匹配的资源放行
                  .anyRequest().authenticated();//剩余任何资源必须认证
                  
	 +      //指定默认的登录页面
	 +     http.formLogin().loginPage("/login.html");
	}
  1. 再一次运行启动类,当访问没有权限的页面时会自动跳转到我们配置的登录页面
    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第4张图片
  2. 配置登录成功跳转的页面
	@Configuration
	@EnableWebSecurity
	public class AppWebSecurityConfig extends WebSecurityConfigurerAdapter {
		@Override
	    protected void configure(HttpSecurity http) throws Exception {
	            //super.configure(http);//默认所有资源不放行,所以注释掉
			http.authorizeRequests().antMatchers("/css/**", "/login.html","/main").permitAll()//设置匹配的资源放行
                  .anyRequest().authenticated();//剩余任何资源必须认证
                  
	      //指定默认的登录页面
	     http.formLogin().loginPage("/login.html");

+ 		http.formLogin().loginProcessingUrl("/login")//这个路径和登录表单上的要一样
+               .usernameParameter("username")
+               .passwordParameter("password")
+            	.defaultSuccessUrl("/main", true);//登录成功后跳转的页面

+     http.csrf().disable();
	}
  1. 现在可以进行登录,用户名为user, 密码为控制台上的密码(不同版本可能不同),登录成功,跳转至我们配置的成功页面
    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第5张图片
  2. 如果我们想要自己配置用户名密码,需要在配置类中添加一个重写方法
	@Configuration
	@EnableWebSecurity
	public class AppWebSecurityConfig extends WebSecurityConfigurerAdapter {
		@Override
	    protected void configure(HttpSecurity http) throws Exception {
	            //super.configure(http);//默认所有资源不放行,所以注释掉
			http.authorizeRequests().antMatchers("/css/**", "/login.html","/main").permitAll()//设置匹配的资源放行
                  .anyRequest().authenticated();//剩余任何资源必须认证
                  
	      //指定默认的登录页面
	     http.formLogin().loginPage("/login.html");

 		http.formLogin().loginProcessingUrl("/login")//这个路径和登录表单上的要一样
               .usernameParameter("username")
               .passwordParameter("password")
               .defaultSuccessUrl("/main", true);//登录成功后跳转的页面

     	http.csrf().disable();
	}

+	@Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+       // super.configure(auth);
+    	auth.inMemoryAuthentication().withUser("zhangsan").password("123456").roles("role")
+                                    .and()
+                                    .withUser("lisi").password("123456").authorities("查看", "删除");

    }
  1. 登录如果报错:java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null,我们在添加一个配置类MyPasswordEncoder实现PasswordEncoder”
    SpringSecurity的简单概述以及配置SpringSecurity的默认登录页面_第6张图片
  2. 再次运行,问题解决

你可能感兴趣的:(spring,java,spring,boot,maven)