前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringSecurity入坑(三)

SpringSecurity入坑(三)

原创
作者头像
是小张啊喂
修改2021-05-13 10:18:32
3230
修改2021-05-13 10:18:32
举报
文章被收录于专栏:软件软件

之前基于内存校验权限值比较简单的,实际上SpringSecurity官方还提供了定制的 jdbc认证

那官方也给出了一个数据库的建表sql现在基于这一套做一个关于权限的控制吧,与之前不同的是,这次我想用角色权限的认证,那就是就说,现在数据库存的就不是权限了,而是一套角色,那我们看一下吧,基础的东西都不需要修改,和内存校验权限几乎是相同的,只是,有些特定的方法,具体的查看官方文档,就只说一下怎么用吧。

我们只需要基于内存验证修改,权限验证模块就可以了,其余的东西不需要修改

构建权限验证

代码语言:javascript
复制
package com.shaojie.jdbcauthority.config;

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.method.configuration.EnableGlobalMethodSecurity;
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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.provisioning.JdbcUserDetailsManager;

import javax.sql.DataSource;

/**
 * @author: 是小张啊
 * @Description: 安全配置
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 密码加密
     *
     * @return
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 注入数据源
     */
    @Autowired
    public DataSource dataSource;

    /**
     * 授权
     *
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        /**
         * 地址:org.springframework.security.core.userdetails.jdbc.users.ddl
         *
         * create table users(
         *      username varchar_ignorecase(50) not null primary key,
         *      password varchar_ignorecase(500) not null,
         *      enabled boolean not null
         * );
         * create table authorities (
         *      username varchar_ignorecase(50) not null,
         *      authority varchar_ignorecase(50) not null,
         *      constraint fk_authorities_users foreign key(username) references users(username)
         * );
         * create unique index ix_auth_username on authorities (
         *      username,authority
         * );
         *
         * 这里的 varchar_ignorecase 类型 mysql 并不支持 替换成 varchar 即可
         *
         * create table users(
         *      username varchar(50) not null primary key,
         *      password varchar(500) not null,
         *      enabled boolean not null
         * );
         * create table authorities (
         *      username varchar(50) not null,
         *      authority varchar(50) not null,
         *      constraint fk_authorities_users foreign key(username) references users(username)
         * );
         * create unique index ix_auth_username on authorities (
         *      username,authority
         * );
         */
       // 基于 JDBC 的验证
        auth.jdbcAuthentication()
                // 设置用户角色的前缀
//                 .rolePrefix("ROLE_")
                // 添加用用户
                // .withUser(new Users())
                // 注入数据源
                .dataSource(dataSource)
                // 设置用于通过用户名查找用户的查询
                .usersByUsernameQuery("select username,password,enabled from users WHERE username=?")
                // 设置查询以通过用户名查找用户的权限
                .authoritiesByUsernameQuery("select username,authority from authorities where username=?")
                // 密码加密
                .passwordEncoder(passwordEncoder());

    }

    /**
     * 验证
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 授权请求
//                .authorizeRequests()
                // antMatchers 设置拦截的请求  hasRole 对应的角色名
                // .hasAnyAuthority("PRODUCT_ADD") 用户所具有的权限
                .antMatchers("/product/add").hasRole("USER")
                .antMatchers("/product/update").hasRole("ADMIN")
                .antMatchers("/product/list").hasRole("USER")
                .antMatchers("/product/delete").hasRole("ADMIN")
                //  access() 允许指定由任意表达式保护的URL 类似 antMatchers("/user/**").access("hasRole('USER') and hasRole('DBA')")
                // permitAll 所有的权限都能访问
                .antMatchers("/login").permitAll()
//                .antMatchers("/**")
                // fullyAuthenticated 不允许匿名用户查看
//                .fullyAuthenticated()
                // 设置所有的请求都必须经过验证才能访问
                .anyRequest().authenticated()
                .and()
                // httpbasic 登录
                // .httpBasic();
                // 表单登录
                .formLogin()
                //  登录请求的页面
                .loginPage("/login")
                // 处理登录请求的 地址
                .loginProcessingUrl("/index")
                // 修改 spring 提供的 默认登陆参数
                .usernameParameter("userName")
                .passwordParameter("password")
                .and()
                // 开启记住我功能
                .rememberMe()
                .and()
                // 开启登出
                .logout()
                .and()
                // 禁用跨域的保护
                .csrf().disable();
    }
}

这里值得注意的是,这里的 password 存入的是加密后的密文,如果存明码,验证是会提醒,编码的密码看起来不像BCrypt

所以在注册权限时就要通过编码加密,当然 jdbc认证也提供了很多的方法,不详细解释了,需要的自己去查阅资料,到SpringSecurity入坑(三)为止,基础的三种权限验证就没有了,详细的深入,还在研究,到这里,了解SpringSecurity就结束了。大家共同进步吧!

喜欢编程的,请关注我的博客https://www.lzmvlog.top/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 构建权限验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档