SpringBoot+SpringSecurity快速入门

目录

简介

快速开始

二、基于管理员模块SpringSecurity快速开始

2.0、首先引入依赖

2.1、继承WebSecurityConfiuraerAdapter

2.2、前端页面

三、基于普通用户模块SpringSecurity快速开始

3.0、引入依赖

 3.1、实现 UserDetaiilsService接口

3.2、继承WebSecurityconfiuraerAdapter

3.3、前端页面


简介

在SpringBoot 2.3.4.RELEASE中集成了SpringSecurity,所以我们只需要引入启动依赖即可。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的
成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方
案。
正如你可能知道的关于安全方面的两个主要区域是“ 认证 ”和“ 授权 ”(或者访问控
制),一般来说,Web 应用的安全性包括 用户认证(Authentication)和用户授权
(Authorization) 两个部分,这两点也是 Spring Security 重要核心功能。
(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问
该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认
证过程。 通俗点说就是系统认为用户是否能登录
(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户
所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以
进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的
权限。 通俗点讲就是系统判断用户是否有权限去做某些事情

快速开始

使用SpringSecurity的快速开始分为两步讲解,因为在公司写项目的过程中,分为前台和后台,而在后台使用登录时,是不需要查询数据库的,因为后台登录是管理员控制,而管理员只需要1~5个即可。在前台我们就需要查询数据库了,所以我将快速开始分为两个模块,一个为后台模块,一个为前台模块

二、基于管理员模块SpringSecurity快速开始

2.0、首先引入依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2.1、继承WebSecurityConfiuraerAdapter

WebSecurityConfigurerAdapter
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                
        String password = passwordEncoder().encode("密码");
        auth.inMemoryAuthentication().withUser("账号").password(password).roles("");
    }
    //引入security自带的密码加密
    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //配置认证
        http.formLogin().loginPage("/login.html")//配置那个url为登录页面

        .loginProcessingUrl("/login")//设置那个是登录的url
        .defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
                .failureForwardUrl("/find.html").permitAll()//登录失败去哪?

//退出时删除缓存,并且重定向到login.html页面   在前端默认路径为:/logout      .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
        //开启frame功能
        http.headers().frameOptions().sameOrigin();
            //这个可以根据自己需求去添加
        http.authorizeRequests().antMatchers(
                "/css/**",
                "/*.html", 
                "/img/**",
                "/js/**",
                "/login",
                "/plugins/**"
                ).permitAll()//制定URL无需保护。
                .anyRequest() //其他请求
                .authenticated();//需要认证


        //关闭csrf跨域
        http.csrf().disable();
    }
}

2.2、前端页面

<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>

注意:name必须叫:usernamepassword      method必须为post提交     action为:/login

 配置完成之后就可以启动项目开始测试了,不管访问什么都会默认到你指定的登录页面,只有登录成功之后才可以访问其他页面!

三、基于普通用户模块SpringSecurity快速开始

3.0、引入依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

 3.1、实现 UserDetaiilsService接口

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
    /**
因为公司项目使用的是Dubbo+zookeeper组合,所以我调用的接口在zookeeper中使用这个注解
如果你使用的是单项目的话可以直接通过spring注入的方式,来获取你的mapper接口!
    
*/
    @Reference(version = "1.0.0")
    SellerService sellerService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //给当前用户创建权限 可自定义 默认就为这个
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_SELLER");
                //通过前端传入的参数获取username,在数据库中查询出来数据
        Seller seller = sellerService.findOne(username);
        //这个是判断用户的状态,如果没有状态,你只需要判断是否为空即可
        if (seller!=null && "1".equals(seller.getStatus())){
            
            return new User(seller.getSellerId(),new BCryptPasswordEncoder().encode(seller.getPassword()),auths);
        }else {
           throw new  UsernameNotFoundException("用户名不存在");
        }

    }


}

3.2、继承WebSecurityconfiuraerAdapter

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //通过数据库查询出来判断账号密码是否相等
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());

    }
    //注入security自带的加密方式
    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //配置认证
        http.formLogin().loginPage("/shoplogin.html")//配置那个url为登录页面

                .loginProcessingUrl("/login")//设置那个是登录的url
                .defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
                .failureForwardUrl("/shoplogin.html").permitAll()//登录失败去哪?
                .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
        
        //  解析前端的 <frame>、<iframe> 标签
        http.headers().frameOptions().sameOrigin();
        //设置无需保护的路径
        http.authorizeRequests().antMatchers(
                "/css/**",
                            "/img/**",
                            "/js/**",
                            "/login",
                            "/plugins/**",
                            "/seller/addSeller",
                             "/*.html"
        ).permitAll()//制定URL无需保护。

                .anyRequest() //其他请求
                .authenticated();//需要认证



        //关闭跨域
        http.csrf().disable();
    }
}

此图片就是上边代码中的内容,可以忽略 

3.3、前端页面

<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>

 3.4、获取被Security管理的用户名

 @RequestMapping("/name")
    public Map<String,String> name(){
            //获取被Security管理的username
        String name= SecurityContextHolder.getContext().getAuthentication().getName();
        
        //将他保存到map等其他类型中就可以传到前端页面或者通过这个名字查询数据库
        Map<String, String> map = new HashMap<>();
        map.put("loginName",name);
        return map;
    }

可以进行测试啦 

请求链:

        当我们启动项目的时候会自动加载3.2中的 configure(HttpSecurity http)方法,然后当我们进入登录页,通过username,password提交post请求数据到/login时,会进入3.1中loadUserByUsername(String username)方法,来进行你数据库之间的判断,判断结束后会进入3.2中的configure(AuthenticationManagerBuilder auth) 方法,交给Security处理是否登录成功

猜你喜欢

转载自blog.csdn.net/wang20000102/article/details/132425212
今日推荐