SpringSecurity的简单使用

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

SpringSecurity的使用分为用户认证和授权以及权限控制,

首先来一个简单的入门,这里不连接数据库,用自定义用户名密码实现简单的拦截。

首先导入jar包,

   
        //集成thymleaf的springsecurity5的jar包
        
            org.thymeleaf.extras
            thymeleaf-extras-springsecurity5
        
        //security启动环境包
        
            org.springframework.boot
            spring-boot-starter-security
        

创建WebSecurityConfig配置类,加入@EnableWebSecurity注解,交给ioc管理,继承WebSecurityConfigurerAdapter类,重写方法

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     *    授权
     *    角色对的才能访问的请求
     *    此处拦截的请求为请求控制器的请求
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //设置那些请求携带哪些身份可以访问
        http.authorizeHttpRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/vip1/**").hasRole("vip1")
                .antMatchers("/vip2/**").hasRole("vip2")
                .antMatchers("/vip3/**").hasRole("vip3");


        //当权限不足的时候跳转到哪里
        http.exceptionHandling().accessDeniedPage("/toLogin");


        //开启登录页认证
        http.formLogin()
                .failureUrl("/login/error")
                .loginPage("/toLogin")
                .loginProcessingUrl("/sLogin")
                .usernameParameter("username")
                .passwordParameter("password");

        //开启CSRF防御后,开启CSRF防御后,访问"/login","/logout",都需要以post的方式
        // post访问的请求需要验证请求中name为"_csrf"的值
        //是否与当前session中存储的"_csrf"的token相同,所以我们需要携带一个隐藏域名为"_csrf"值为token
        //token由spring Security自动生成并放在request的attribute中和session里面
        http.csrf().disable();


        //开启注销
        http.logout().logoutSuccessUrl("/toLogin");
    }
    /**
     *    认证
     *    给用户名和密码匹配对的加入角色
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("lijiaqi").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("vip1").password(new BCryptPasswordEncoder().encode("123")).roles("vip1")
                .and()
                .withUser("vip2").password(new BCryptPasswordEncoder().encode("123")).roles("vip2");
    }
}

前端页面中




    
    Title





用户名 角色 注销

vip3-add3 vip3-del3 vip3-up3

controller层的编写

@Controller
public class SecurityController {

    /**
     *    失败后跳转
     */

    @RequestMapping("/login/error")
    public String loginError(Model model){
        model.addAttribute("error","账号密码错误");
        return "views/login";
    }
    /**
     *    失败后跳转
     */
    @RequestMapping("/")
    public String toIndex(){
        return "index";
    }
    /**
     *    去登陆页面
     */
    @RequestMapping("toLogin")
    public String toLogin(){
        return "views/login";
    }

    /**
     *    restful风格编程
     */
    @RequestMapping("vip1/{src}")
    public String vip1(@PathVariable("src") String src){
        return "views/vip1/"+src;
    }

    @RequestMapping("vip2/{src}")
    public String vip2(@PathVariable("src")String src){
        return "views/vip2/"+src;
    }

    @RequestMapping("vip3/{src}")
    public String vip3(@PathVariable("src")String src){
        return "views/vip3/"+src;
    }

}

你可能感兴趣的:(网络运维,安全架构)