ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot整合SpringSecurity实现认证、授权功能简单入门案例

2022-01-31 10:01:23  阅读:153  来源: 互联网

标签:username 入门 登录 SpringSecurity String 自定义 ROLE public springboot


目录

一、SpringSecurity介绍

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

二、springboot整合Spring Security

1、新建
使用spring initializr 新建springboot项目
在这里插入图片描述
记得勾选Spring Security
2、
控制层:

/**
 * @author Mae
 */
@Controller
public class UserController {

    @RequestMapping
    public String indexPage() {
        return "redirect:index.html";
    }
}

没有指定默认登录页,则使用security默认登陆页面
在这里插入图片描述
默认登陆页
用户名默认为 user
密码为 控制台打印的密文在这里插入图片描述

在这里插入图片描述
登录后就会跳转到首页
在这里插入图片描述

三、自定义登录逻辑和权限

1、持久层
即数据库根据用户名查询用户

/**
 * @author Mae
 */
 @Mapper
public interface UserMapper {

    /***
     * 查找用户名
     * @param username
     * @return
     */
    User findUsername(String username);

}

对应的xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atmae.springsecurity.mapper.UserMapper">
    <select id="findUsername" resultType="com.atmae.springsecurity.pojo.User">
        select *
        from t_user
        where username = #{username}
    </select>
</mapper>

2、
配置类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public PasswordEncoder getPw() {
        return new BCryptPasswordEncoder();
    }
     @Override
    protected void configure(HttpSecurity http) throws Exception {
        /** 表单提交*/
        http.formLogin()
                .usernameParameter("username")
                .passwordParameter("password")
                /** 当发现/login时 认为是登录 需和表单提交地址相同*/
                .loginProcessingUrl("/login")
                     /** 自定义登录页面*/
                .loginPage("/login.html")                
                /** 成功后执行post请求*/
                .successForwardUrl("/index")
                /** 失败后执行post请求*/
                .failureForwardUrl("/error");
        http.authorizeHttpRequests()
                /** 配置路径放行*/
                .antMatchers("/error.html").permitAll()
                .antMatchers("/login.html").permitAll()
                .antMatchers("/**/*.png").permitAll()
                /** 正则表达式 放行*/
                .regexMatchers(".+[.]png").permitAll()
                /** 权限管理 是改权限才能后登录member页面*/
                .antMatchers("/member.html").hasAnyAuthority("admin")
                /** 角色判断 是改角色才能够登录member页面*/
                .antMatchers("/member.html").hasRole("student")
                /** 所有请求都必须被认证*/
                .anyRequest().authenticated();
        /** 关闭防火墙*/
        http.csrf().disable();
       }
  }

BCryptPasswordEncoder:密码加密算法,其过程不可逆
相应的登录页面:

<form action="/login" method="post">
    <label for="username"></label><input type="text" id="username" name="username" placeholder="请输入用户名">
    <label for="password"></label><input type="password" id="password" name="password" placeholder="请输入密码">
    <input type="submit" value="提交">
</form>

注:

  • 1、action中的url地址必须与
    .loginProcessingUrl("/login")中url地址相同只有遇到/login时才会被认为是登录
  • 2、 .usernameParameter("username")和.passwordParameter("password")中的参数如何跟表单中name属性相同则可省略,否则不可省略

业务层:

/**
 * @author Mae
 */
 @Service
public class UserServiceImpl implements UserDetailsService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        /** 查询数据库判断用户名是否存在*/
        User user = userMapper.findUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户名没有找到");
        }
        /** 把查询出的密码(注册时已经过加密)进行解析,或者直接把密码放入构造方法*/
        String password = passwordEncoder.encode(user.getPassword());
        return new org.springframework.security.core.userdetails.User(username, password, AuthorityUtils
                .commaSeparatedStringToAuthorityList("admin,normal,ROLE_student"));
    }
}
/** 表示设置权限和角色 admin和normal为权限 ROLE_student为角色
*	注意:ROLE_不可省略
*/
 AuthorityUtils
                .commaSeparatedStringToAuthorityList("admin,normal,ROLE_student")

数据库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
会员页可以正常跳转

将业务层方法改为

return new org.springframework.security.core.userdetails.User(username, password, AuthorityUtils
                .commaSeparatedStringToAuthorityList("admin,normal0,ROLE_student0"));

配置类不变
在这里插入图片描述
首页可以正常跳转
在这里插入图片描述
会员页无法正常跳转 报状态码403即权限不足

四、自定义成功和失败处理器

原因:目前项目都是前后端分离,为了解决跨域问题

.successForwardUrl("/index")和.failureForwardUrl("/error");只能处理post请求

定义成功处理器

/**
 * @author Mae
 */

public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    private String url;

    public MyAuthenticationSuccessHandler(String url) {
        this.url = url;
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {

        response.sendRedirect(url);
    }
}

配置类
http .successHandler(new MyAuthenticationSuccessHandler("http://www.baidu.com")
在这里插入图片描述

在这里插入图片描述

失败处理器配置相同
即实现AuthenticationFailureHandler接口

五、自定义403状态码错误页面

查看403状态码
在这里插入图片描述
一定不要忘记添加Component注解 交给spring管理

/**
 * @author Mae
 */
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        /** 403状态码*/
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        /** 使用json传输数据*/
        response.setHeader("Content-Type","application/json;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write("{\"status\":\"error\",\"meg\":\"权限不足,请联系管理员\"}");
        writer.flush();
        writer.close();
    }
}

在配置类中注入并且配置异常处理

@Autowired
private MyAccessDeniedHandler myAccessDeniedHandler;




  /** 异常处理*/
        http.exceptionHandling()
                .accessDeniedHandler(myAccessDeniedHandler);

在这里插入图片描述

六、注解配置

首先在springboot启动类中开启注解(默认关闭)

@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class SecuritydemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SecuritydemoApplication.class, args);
    }

}

在控制层中

@PreAuthorize:在登录之前调用此方法 可以省略ROLE_
@Secured:相同作用 但是角色前必须加ROLE_

   @Secured("ROLE_student0")
    @PreAuthorize("hasRole('ROLE_student0')") /** 可以不以Role开头*/
    @RequestMapping("/index")
    public String indexPage() {
        return "redirect:index.html";
    }

在这里插入图片描述
成功跳转

标签:username,入门,登录,SpringSecurity,String,自定义,ROLE,public,springboot
来源: https://blog.csdn.net/weixin_51799151/article/details/122755136

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有