准备系统的研究下Spring Security:https://www.youtube.com/watch?v=her_7pa0vrg

先了解一下Http请求状态码

400 Bad request

401 Unauthorized 未认证

403 Forbidden 权限不足,注意,权限不足的前提是已经认证了!

404 Not found 网络资源不存在

认证:用户登陆,让系统获取到用户信息

授权:给与登陆的当前登陆的用户授予访问不同资源的权限

原理是基于:Spring AOP思想,基于servlet过滤器实现的安全框架。在不修改代码的情况下,对代码进行增强

什么是CSRF

跨站伪造请求,相关病毒获取Cookie的所有信息,就可以代替原有登陆成功的用户发送请求

Spring Security默认是开启的,同时CSRF不会拦截GETHEADOPTIONTRACE 4种,请求,可以查看 https://www.cnblogs.com/dalianpai/p/12393133.html

项目Context-Path下/login是认证 ,/logout是退出认证

@PathVariable

当输入认证的时候,浏览器就会追加一个Cookie、并且在Header中追加Authorization,但决定能够通过认证的是Cookie,认证前后Cookie会发生变化!

基于角色认证

还有一个配置时:https://www.cnblogs.com/zimug/p/11870861.html

@Configuration
@EnableWebSecurity
public class SecruityConfig extends WebSecurityConfigurerAdapter {

    // 在Spring5中引入很多加密,SpringSerity需要指定密码加密
    @Autowired 
    PasswordEncoder passwordEncoder;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/","index","/css/*","/js/*").permitAll()//放行的资源
                .antMatchers("/api/**").hasRole(ApplicationUserRole.STUDENT.name())//让Studnet账号访问/api/**
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
        //super.configure(http);
        // 如果需要指定访问其他资源,请指定下面内容
        http.formLogin();
    }

    @Override
    @Bean
    protected UserDetailsService userDetailsService() {
        /**
         * 构建一个用户账号admin,admin 作为ADMIN权限
         */
        UserDetails userDetails1 = User.builder()
                .username("admin")
                .password(passwordEncoder.encode("admin"))
                .roles(ApplicationUserRole.ADMIN.name())   //标记为Student权限
                .build();
        /**
         * 构建一个用户账号student,student 作为STUDENT权限
         */
        UserDetails userDetails2 = User.builder()
                .username("student")
                .password(passwordEncoder.encode("student"))
                .roles(ApplicationUserRole.STUDENT.name())   //标记为Student权限
                .build();

        return new InMemoryUserDetailsManager(
                userDetails1,userDetails2);
        //return super.userDetailsService();
    }
}

基于权限认证

登陆请求的处理地址,

退出的url,

然后退出成功后跳转的URL地址

同时认证页面必须是post请求

remember-me 需要表单提交的时候,指定一个input checkbox 名为 remember-me 值为 true、on、yes或者1 都行

指定remember-me过期时间,登陆时勾选 会自动添加cookie到前端

如果想自定义数据库的账号,进行授权认证

1、继承一个UserDetailsService类,重写其方法,此方法返回null 则判定授权失败!构造参数可以鉴别账号是否封停、密码泄露、是否锁定等,请使用最全的构造方法,实现认证

2、去数据库查询账号密码,密码对了,再去封装参数对象,添加进去,然后在封装认证的信息,返回回去

3、数据库的密码必须进行加密。因为SpringSecurity 加密是动态加盐加密,所以每次加密的密码输出结果不一样,就无法通过暴力字典查出密码了

SpringIOC 是核心监听父容器 SpringMVC加载的IOC子容器

父容容器对象可以被子容器对象访问,但是父容器对象不能访问子容器对象

父容器不可被Http请求,但是子容器可以被Htpp请求 如Controller层

所以,我们追加授权的时候,可以加载Controller 也可在Service访问,推荐写在Service中

发表评论

您的电子邮箱地址不会被公开。