SpringBoot使用篇---SpringBoot整合springSecurity

SpringBoot使用篇---SpringBoot整合springSecurity_第1张图片

目录:

   前言
   SpringBoot整合SpringSecurity
   总结
   分享与交流

前言

   安全是项目运行的重要保障,每一个项目在公测之前都会进行严格的认证和授权,阻挡恶意请求,保护项目安全。尽管如此,我们依然有时候能听到某某公司数据泄露,某某公司有重大Bug,所以安全验证就变得越来越重要,是我们在项目中需要考虑的重要因素。
   Java领域常用的安全框架有Shiro和SpringBoot。Shiro拥有轻量级的特性从而被广泛使用,但它是第三方框架;Spring Security是一个相对重量级的安全框架,通过名字我们应该也能看到,它是Spring官方的框架,因此在整合方面要占有一定的优势,而且它的功能比Shiro强大些,只要Shiro能实现一般它都能实现。同时SpringBoot提供了自动化配置,做到了开箱即用,因此Spring Security相对来说是Java领域安全框架的最优选择之一。

SpringBoot整合SpringSecurity

  具体步骤如下
(1)SpringBoot工程如何搭建可以参考SpringBoot框架搭建
(2)引入SpringBoot相关依赖

		>
	        >org.springframework.boot>
	        >spring-boot-starter-parent>
	        >2.2.4.RELEASE>
	        > <!-- lookup parent from repository -->
	    

        >
            >org.springframework.boot>
            >spring-boot-starter-web>
        >

        >
            >org.yaml>
            >snakeyaml>
            >1.23>
        >

(3)引入SpringSecurity依赖

        >
            >org.springframework.security>
            >spring-security-web>
            >5.1.5.RELEASE>
        >
        >
            >org.springframework.security>
            >spring-security-config>
            >5.1.5.RELEASE>
        >
        >
            >org.springframework.security>
            >spring-security-core>
            >5.1.5.RELEASE>
        >

(4)配置SpringBoot配置文件

#注意每个属性名和属性值之间至少一个空格,注释使用#不是//
spring:
  thymeleaf:
    prefix: classpath:/templates/ #前缀
    suffix: .html #后缀
    servlet:
      content-type: text/html #在请求中,客户端告诉服务端实际请求的内容
                              #在响应中,服务端告诉请求端实际响应的内容
    encoding: utf-8 #设置编码格式
    mode: HTML  #校验HTML格式
    cache: false  #关闭缓存,在开发过程中可立即看到修改后的结果

(5)创建Handler

@Controller
@RequestMapping("security")
public class SecurityController {

    @RequestMapping("add")
    public String add(){
        return "add";
    }

    @RequestMapping("update")
    public String update(){
        return "update";
    }

    @RequestMapping("find")
    public String find(){
        return "find";
    }

    @RequestMapping("delete")
    public String delete(){
        return "delete";
    }
}
    @RequestMapping("index")
    public String index(){
        return "index";
    }

    @RequestMapping("error403")
    public String forbidden(){
        return "error403";
    }
    
    @RequestMapping("/login")
    public String login(){
        return "login";
    }

(6)创建相对应页面
index.html

>
>添加功能>
>修改功能>
>查询功能>
>删除功能>
>

add.html

>
添加功能页面
>

find.html

>
查找功能页面
>

delete.html

>
删除功能页面
>

update.html

>
删除功能页面
>

login.html

<body>
<form action="/login" method="post">
    用户名:<input type="text" name="userName"><br/>
    密码:<input type="password" name="password"><br/>
    <input type="submit" value="登录">
</form>
</body>

(7)一个简单的mvc就完成了,我们继续实现SpringSecurity
创建SpringSecurityConfig

@Configuration
@EnableWebSecurity //启动SpringSecurity过滤器链
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    //该方法作用是代替配置文件中配置的
    /*
    用于配置对用户输入密码进行加密并与数据库密码进行配对
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //如果程序报错There is no PasswordEncoder mapped for the id "null",就将该段注释添加下边代码
        //或者在MyPasswordEncoder类上加一个@Component注解,使它成为一个Bean
        auth.inMemoryAuthentication().withUser("admin").password("123456").authorities("ADMIN_ADD","ADMIN_FIND");//自定义登录用户用户名和密码并赋予一些权限

        //上边代码如果使程序报错,就更换以下代码,这个是使用了匿名内部类
        //auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("lxy").password("lxy").authorities("ADMIN_ADD","ADMIN_FIND");
    }

    /*该方法作用是代替配置文件中配置的标签
     用来配置拦截资源--拦截什么资源,需要什么样的身份进行访问
                      自定义spring security拦截器
                      权限不足的处理
                      ReadMe功能
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/security/add").hasAuthority("ADMIN_ADD") //ADMIN_ADD身份用户可访问/security/add页面
                    .antMatchers("/security/find").hasAuthority("ADMIN_FIND")
                    .antMatchers("/security/update").hasAuthority("ADMIN_UPDATE")
                    .antMatchers("/security/delete").hasAuthority("ADMIN_DELETE")
                    .antMatchers("/login").permitAll() //login页面不拦截,任何权限都可访问login页面
                    .antMatchers("/**") //代表拦截所有的访问请求
                    .fullyAuthenticated()
                    .and()
                    .formLogin()  //登陆页面是springSecurity默认的  .formLogin().loginPage("/login")自定义登陆页面  也可设置为 .httpBasic()  登陆页面是弹窗框
                    .and()
                    .csrf().disable(); //关闭跨站请求拦截
    }
}

(8)创建MyPasswordEncoder

@Component
public class MyPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return s.equals(charSequence.toString());
    }
}

(9)创建错误页面处理类ErrorPageConfig
   环境是基于SpringBoot2.0以上版本,以下版本是继承mbeddedServletContainerCustomizer

@Configuration
public class ErrorPageConfig implements ErrorPageRegistrar {


    @Override
    public void registerErrorPages(ErrorPageRegistry registry) {
        ErrorPage error403Page=new ErrorPage(HttpStatus.FORBIDDEN,"/error403");
        registry.addErrorPages(error403Page);
    }
}

(10)配置SpringBoot启动类

@SpringBootApplication
@MapperScan("cn.lxy.spring_boot1.repository")
public class SpringBoot1Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringBoot1Application.class, args);
    }

}

(11)测试
   访问localhost:8080/index
在这里插入图片描述
   页面被拦截自动跳转到登陆页面,登陆页面是SpringSecurity默认的登陆页面,也可自定义登陆页面。
SpringBoot使用篇---SpringBoot整合springSecurity_第2张图片
   账号或密码输入错误,登陆失败
SpringBoot使用篇---SpringBoot整合springSecurity_第3张图片
   输入上边我们设置好的admin/123456,进入localhost:8080/index
在这里插入图片描述
   访问添加功能查询功能
SpringBoot使用篇---SpringBoot整合springSecurity_第4张图片
SpringBoot使用篇---SpringBoot整合springSecurity_第5张图片
   访问修改功能删除功能
在这里插入图片描述
在这里插入图片描述

总结

   以上是SpringBoot整合SpringSecurity的简单使用,SpringSecurity还有很多需要学习的地方。相比于Shiro,Spring Security因其是Spring全家桶中的一员,因此可以和Spring应用无缝衔接,使用起来会更加方便,系统安全是项目运行的重中之重,使用Spring Security进行管理,可以对访问权限进行认证,从而提高项目的安全性。

分享与总结

   由于能力有限,博客总结难免有不足,还请大佬们不吝赐教

你可能感兴趣的:(Spring,Boot)