原创

教你SpringBoot整合SpringSecurity(保姆级教学)


话不多说,开干!

先把maven依赖导入进来
<!--SpringSecurity 依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后我们要创建一个SecurityConfig类来继承WebSecurityConfigurerAdapter这个类并重写他的两个configure(HttpSecurity http)(授权)configure(AuthenticationManagerBuilder auth)(认证)的方法。ps:请认真看代码块的内容
package com.juju.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {//Http安全策略
        //首页所有人可以访问,但是里面的功能页只有对应有权限的人才能访问
        //请求授权的规则 authorizeRequests = 用户验证
        http.authorizeRequests()
                .antMatchers("/").permitAll()//antMatchers =那个页面 再.就是谁可访问permitAll=所有人
                .antMatchers("/level1/**").hasRole("vip1")//leverl1下面的所有页面,只有vip1权限的人有权访问
                .antMatchers("/level2/**").hasRole("vip2")//leverl2下面的所有页面,只有vip2权限的人有权访问
                .antMatchers("/level3/**").hasRole("vip3");//lever31下面的所有页面,只有vip3权限的人有权访问

        //没有权限默认会跳到登陆页面,需要开启登陆的页面
            //为什么会到/login页面
        http.formLogin().loginPage("/toLogin").loginProcessingUrl("/login");//loginPage() 是定制登陆页面的,toLogin是在controller上写的,去登陆页面的方法

        http.rememberMe().rememberMeParameter("remember"); //开启记住我功能,cook默认保存两周

        //注销,开启了注销功能
        http.csrf().disable(); //关闭防止跨站脚本攻击功能
        http.logout().logoutSuccessUrl("/");//注销后到首页

    }

    //认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        /**
         * inMemoryAuthentication = 内存认证
         * jdbcAuthentication = 数据库认证
         *
         * whitUser =用户名
         * password = 密码
         * roles = 拥有的权限
         *
         * ps:
         *  在Spring Secutiry 5。0x中,新增了很多的加密方式,如果不加密就会报错,不让你使用
         *   1.解决方法:在内存/数据库认证后面加 .passwordEncoder(new BCryptPasswordEncoder())
         *   2.在.password(new BCryptPasswordEncoder().encode("123456"))
         */
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("juju").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3");

    }
}
然后到这一步就可以通过controller层的方法来调用啦
package com.juju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RouterController {
    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }
    @RequestMapping("/toLogin")
    public String toLogin(){
        return "views/login";
    }
    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id){
        return "views/level1/"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id){
        return "views/level2/"+id;
    }
    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id){
        return "views/level3/"+id;
    }

}

补充下:

  • 就是一共有三个level,每一个level下面都有对应的3个html文件,具体的请看SecurityConfig这个类,里面有很多的注释。
  • 程序运行的结果就是: 'juju'这个用户只能有权限访问:vip2,vip3所对应的页面(也就是level2,和level3这两个页面)而level1这个页面已经被SpringSecurity拦截下来了
  • 而 'root' 这个用户有最高的权限('vip1' 'vip2' 'vip3' ),所以他能访问所有的level页面
  • 如有不足请在下方留言或加我QQ/微信向我提问,祝大家生活愉快。
SpringBoot
随笔
错误日志提示
  • 作者:JarvisYang(联系作者)
  • 发表时间:2020-05-25 16:14
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 评论