springboot2.0+集成springsecurity

springsecurity是做什么的相信大家都是知道的,跟shiro一样是一个权限控制框架。本文将带你一步一步使用springboot集成springsecurity。没有使用过的小白也能迅速入手。
先来看一下效果预览吧

环境准备:
开发工具:idea
依赖管理:maven3.5+

  • 引入新建页面和controller来实现基本的跳转

  • 添加依赖


        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.study
    spring-security
    0.0.1-SNAPSHOT
    spring-security
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-freemarker
        
        
            org.projectlombok
            lombok
            true
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
  • 配置freemark页面及静态资源映射
spring:
  freemarker:
    #设置模板后缀名
    suffix: .ftl
    #设置文档类型
    content-type: text/html
    #设置页面编码格式
    charset: utf-8
    #设置页面缓存
    cache: false
    #设置ftl文档路径
    template-loader-path:
      - classpath:/templates
  #设置静态文件路径  css、js等
  mvc:
    static-path-pattern: /static/**

  • 添加页面

springboot2.0+集成springsecurity_第1张图片
springboot2.0+集成springsecurity_第2张图片
springboot2.0+集成springsecurity_第3张图片
springboot2.0+集成springsecurity_第4张图片
springboot2.0+集成springsecurity_第5张图片
springboot2.0+集成springsecurity_第6张图片

  • 编写控制器
@Controller
@Slf4j
public class OrderController {
    @GetMapping("/login")
    public String login(HttpServletRequest request){
        return "login";
    }

    @RequestMapping("/menu")
    public String menu(HttpServletRequest request){
        return "menu";
    }
    @RequestMapping("/create")
    public String create(HttpServletRequest request){
        return "create";
    }
    @RequestMapping("/delete")
    public String delete(HttpServletRequest request){
        return "delete";
    }
    @RequestMapping("/update")
    public String update(HttpServletRequest request){
        return "update";
    }
    @RequestMapping("/query")
    public String query(HttpServletRequest request){
        return "query";
    }

}
  • 启动程序,浏览器可直接访问,效果如下:
    springboot2.0+集成springsecurity_第7张图片

  • 添加springsecurity权限拦截:

  • 添加maven依赖:


            org.springframework.boot
            spring-boot-starter-security
        
  • 配置springsecurity
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//    配置认证用户信息和权限
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      //设置添加用户   密码   权限名称(实际项目可从数据库中查询来初始化)
        auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("管理员","root用户");
        auth.inMemoryAuthentication().withUser("root").password("root").authorities("root用户");
        auth.inMemoryAuthentication().withUser("query").password("query").authorities("普通用户");
    }

//    配置拦截请求资源
    @Override
    protected void configure(HttpSecurity http) throws Exception {
       //拦截所有请求   使用httpbasic认证模式
        http.authorizeRequests().antMatchers("/**").fullyAuthenticated().and().httpBasic();
    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder(){
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }
}
  • 在此启动程序,访问效果如下:

  • 修改认证模式:
package com.study.springsecurity.config;

import com.study.springsecurity.config.authorize_result.AuthorizationFailHandler;
import com.study.springsecurity.config.authorize_result.AuthorizationSuccessHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.password.NoOpPasswordEncoder;

/**
 *security配置
 * @author liuqinfu
 * @date 2019-08-11 14:45
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//    配置认证用户信息和权限
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("管理员","root用户");
        auth.inMemoryAuthentication().withUser("root").password("root").authorities("root用户");
        auth.inMemoryAuthentication().withUser("query").password("query").authorities("普通用户");
    }

//    配置拦截请求资源
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        httpbasic认证模式
//        http.authorizeRequests().antMatchers("/**").fullyAuthenticated().and().httpBasic();
//       formlogin认证模式
        http.authorizeRequests().antMatchers("/**").fullyAuthenticated().and().formLogin();
    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder(){
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }
}

  • 清空浏览器缓存,在此启动程序,效果如下:

    我们发现两种认证模式在前端的页面显示不一样。
  • 接下来配置用户权限,我们已经添加了三个用户:admin、root、query,接下来我们让admin
    拥有删除订单、修改订单、新增订单功能,query用户只有查询订单功能。
    修改代码如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

//    配置认证用户信息和权限
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("管理员","root用户");
        auth.inMemoryAuthentication().withUser("root").password("root").authorities("root用户");
        auth.inMemoryAuthentication().withUser("query").password("query").authorities("普通用户");
    }

//    配置拦截请求资源
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        httpbasic认证模式
//        http.authorizeRequests().andMatchers("/**").fullyAuthenticated().and().httpBasic();
        http.authorizeRequests()
                .antMatchers("/delete","/create","/update").hasAnyAuthority("管理员")
                .antMatchers("/query").hasAnyAuthority("普通用户")
                .antMatchers("/**").fullyAuthenticated().and().formLogin();
    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder(){
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }
}

在此启动程序,清除缓存后运行效果如下:
admin用户

query用户效果如下:

至此我们已经实现了权限控制

你可能感兴趣的:(java,spring-security)