Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot+mybatis+security ajax实现session保存User实体

springboot+mybatis+security ajax实现session保存User实体

作者头像
用户5899361
发布于 2020-12-31 06:32:06
发布于 2020-12-31 06:32:06
53300
代码可运行
举报
文章被收录于专栏:学习java的小白学习java的小白
运行总次数:0
代码可运行

AuthorityTeacher

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.entity
 * @Author: huat
 * @Date: 2020/12/28 12:43
 * @Version: 1.0
 * 教师实体类
 */
public class AuthorityTeacher implements UserDetails {
    private int teacherId;
    private String username;//账号
    private String password;//密码
    private String teacherName;//真实名称
    private List<AuthorityRole> authorityRoles;

    public int getTeacherId() {
        return teacherId;
    }

    public void setTeacherId(int teacherId) {
        this.teacherId = teacherId;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    //@Override
    public String getPassword() {
        return password;
    }

    public String getTeacherName() {
        return teacherName;
    }

    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }
    @Override
    public String getUsername() {
        return username;
    }

    public List<AuthorityRole> getAuthorityRoles() {
        return authorityRoles;
    }

    public void setAuthorityRoles(List<AuthorityRole> authorityRoles) {
        this.authorityRoles = authorityRoles;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorityRoles;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

Role

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.security.core.GrantedAuthority;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.entity
 * @Author: huat
 * @Date: 2020/12/28 13:09
 * @Version: 1.0
 * 角色实体类
 */
public class AuthorityRole implements GrantedAuthority {
    private int roleId;
    private String roleName;//角色
    private String roleNameCN;//角色中文

    @Override
    public String getAuthority() {
        return roleName;
    }

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleNameCN() {
        return roleNameCN;
    }

    public void setRoleNameCN(String roleNameCN) {
        this.roleNameCN = roleNameCN;
    }
}

service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.security.core.userdetails.UserDetailsService;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.service.admin
 * @Author: huat
 * @Date: 2020/12/28 16:23
 * @Version: 1.0
 */
public interface TeacherService extends UserDetailsService {


}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.service.admin
 * @Author: huat
 * @Date: 2020/12/28 16:24
 * @Version: 1.0
 */
@Service
public class TeacherServiceImpl implements TeacherService {

    @Autowired
    private TeacherDao teacherDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return teacherDao.getAuthorityTeacherByUsername(username);
    }
}

权限配置类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.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.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.filter
 * @Author: huat
 * @Date: 2020/12/28 12:24
 * @Version: 1.0
 */
@Configuration
@EnableWebSecurity
public class SpringSercurityConfig extends WebSecurityConfigurerAdapter  {

    @Autowired
    TeacherService teacherService;
    @Autowired
    AuthenticationSuccessHandler authenticationSuccessHandler;//ajax登陆成功使用
    @Autowired
    AuthenticationFailureHandler authenticationFailureHandler;//ajax登陆失败使用

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new MD5Util();
    }


    /**
     * 将账号密码设置在数据库当中
     * @param auth
     * @throws Exception
     */
    @Override
    public  void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                //将UserDetailsService放到容器中
                .userDetailsService(teacherService)
                //加密方式放入
                .passwordEncoder(passwordEncoder());
    }

    /**
     * 权限配置
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //释放静态资源,指定资源拦截规则,
        // 指定自定义认证页面,指定退出认证配置,csrf(跨域伪造请求)配置
        http.authorizeRequests()
                .antMatchers("intoLogin","login.jsp","/webapp/**").permitAll()//释放这些资源,允许匿名访问
                .antMatchers("/**").hasAnyRole("ADMIN","USER")
                .anyRequest().authenticated()//其他资源需要认证
                .and()
                .formLogin()
                .loginPage("/intoLogin")//登陆页请求的接口
                .loginProcessingUrl("/doLogin")//登陆地址,由springSecurity提供
                .usernameParameter("username")//登陆账号的name值
                .passwordParameter("password")
                .successHandler(authenticationSuccessHandler)//登陆成功
                .failureHandler(authenticationFailureHandler)//登陆失败
                .permitAll()//指定所有资源释放
                .and()
                .logout()//登出
                .logoutUrl("/logout")//指定登出路径
                .logoutSuccessUrl("/login.jsp")//登出成功后跳转的url
                .invalidateHttpSession(true)//是否清空session
                .permitAll()
                .and()
                .csrf()
                .disable();//关闭csrf(跨域伪造请求)
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.filter
 * @Author: huat
 * @Date: 2020/12/29 9:14
 * @Version: 1.0
 */
@Component
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("code",1);
        map.put("msg","账号密码错误");
        map.put("data","");
        /*   httpServletResponse.setContentType("application/json;charset=utf-8");*/
        PrintWriter out = httpServletResponse.getWriter();
        out.write(JSON.toJSONString(map));
        out.flush();
        out.close();
    }
}

登陆成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * @ProjectName: teaching
 * @Package: cn.bdqn.filter
 * @Author: huat
 * @Date: 2020/12/29 9:16
 * @Version: 1.0
 */
@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if(null!=auth){
            httpServletRequest.getSession().setAttribute("user",auth.getPrincipal());
        }
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("code",0);
        map.put("msg","登陆成功");
        map.put("data","");
        /*   httpServletResponse.setContentType("application/json;charset=utf-8");*/
        PrintWriter out = httpServletResponse.getWriter();
        out.write(JSON.toJSONString(map));
        out.flush();
        out.close();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++11新特性之线程操作
  C++11之前没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。
全栈程序员站长
2022/07/18
5860
C++ 中文周刊 2025-02-01 第177期
如果if里的nickName存在等于nullptr的可能,那么memcpy的行为会有UB,那么这个代码必然有问题了
王很水
2025/02/04
510
C++ 中文周刊 2025-02-01 第177期
Zookeeper C++编程实战之配置更新
CZookeeperHelper: https://github.com/eyjian/libmooon/blob/master/include/mooon/net/zookeeper_helper.h CMainHelper: https://github.com/eyjian/libmooon/blob/master/include/mooon/sys/main_template.h
一见
2018/12/13
1.4K0
C++ 中文周刊 第80期
从reddit/hackernews/lobsters/meetingcpp知乎等等摘抄一些c++动态
王很水
2022/09/23
2910
C++:thread | condition_variable|mutex
相信大家在Linux系统编程中都接触过线程创建和退出的相关系统调用,这些系统调用是Linux环境下的一套线程设计方案。但是这种设计方案仅限于Linux环境下使用,其缺点就是可移植性差。所以C++设计了thread库,该库可以适用于任何平台下,从根本上解决了可移植性差的问题。
破晓的历程
2024/10/10
1630
大华摄像头暴破工具bruteforceCamera
大家好,我是余老师。今天有小伙伴有需求,所以写了个小工具,用于摄像头密码爆破。文末会给出下载地址,后续有需求会持续更新版本。
白帽子安全笔记
2024/10/28
7545
大华摄像头暴破工具bruteforceCamera
【C++】C++11线程库 和 C++IO流
1. C++11的线程库实际封装了windows和linux底层的原生线程库接口,在不同的操作系统下运行时,C++11线程库可以通过条件编译的方式来适配的使用不同的接口,比如在linux下,就用封装POSIX线程库的接口来进行多线程编程,在windows下,就用封装WinAPI线程库的接口来进行多线程编程。所以C++11线程库为我们带来了可移植性编程。
举杯邀明月
2023/10/17
4120
【C++】C++11线程库 和 C++IO流
【C++】基础:获取ping的时延数据示例
PING是一种常用的网络工具,用于测试计算机之间的连接状况和测量网络时延。它发送一个小的数据包到目标计算机,并等待接收响应。通过测量从发送到接收的时间差,可以得出网络延迟或往返时间(Round-Trip Time, RTT),即从发送请求到获取响应的时间。
DevFrank
2024/07/24
3480
(五)如何编写高性能日志
一、服务器端日志与客户端日志的区别 在正式讲解之前,我们先来看一个日志类的实现方法,这个日志类也是代表着大多数客户端日志的主流写法: /** *@desc: 程序运行log类,log.h *@author: zhangyl *@date: 2017.01.17 **/ #ifndef __LOG_H__ #define __LOG_H__ #ifdef _ZYL_LOG_ #define LogInfo(...) Log::GetInstance(
范蠡
2018/04/04
1.5K0
asio 调度器实现 - strand 实现详解
只有一个线程在执行scheduler::run() 的情况, 我们不需要担心任务执行的先后顺序,它们始终是严格按照post()的先后顺序来执行的. 那么如果我们更多的利用多核, 使用多个线程执行同一个
fangfang
2023/05/23
1.3K0
mysql 连接池的实现
涉及后端的数据交互管理的时候,我们在应用层总是希望将一些过程进行封装进行规模化管理,池化技术基本就是来干这种事情的,线程池,内存池,连接池,请求池等等都是来干这种事情的,当然如果从算法层面来说,这种就是用空间来换时间的做法。我们的很多著名的算法也是基于这样的方式来优化的,著名的 KMP 算法,通过维护一个 next 数组,来降低算法的时间复杂度。
ge3m0r
2024/05/26
2650
微服务开源框架TARS 之 基础组件
本文源自herman的系列文章之一《鹅厂开源框架TARS之基础组件》。相关代码已按TARS开源社区最新版本更新。
TARS基金会
2020/09/01
1.2K0
微服务开源框架TARS 之 基础组件
通过edge://tracing工具进行C++的可视化基准测试
在测试函数类构建一个Timer对象让他开始计时,再离开函数作用时会自动调用析构函数停止计时并且输出耗时结果
晨星成焰
2024/01/29
6232
通过edge://tracing工具进行C++的可视化基准测试
跟面试官刚同步异步编程,有她完全够用了
并行化业务逻辑:经常需要频繁的发送,等待,接收其他业务线程的数据,信息交换是常见且高频的行为,这个时候就要开发高效的异步编程了。
用户9831583
2022/06/16
6050
跟面试官刚同步异步编程,有她完全够用了
心跳包机制设计详解
情形一:一个客户端连接服务器以后,如果长期没有和服务器有数据来往,可能会被防火墙程序关闭连接,有时候我们并不想要被关闭连接。例如,对于一个即时通讯软件,如果服务器没有消息时,我们确实不会和服务器有任何数据交换,但是如果连接被关闭了,有新消息来时,我们再也没法收到了,这就违背了“即时通讯”的设计要求。
范蠡
2019/08/09
7.3K0
C++并发编程(C++11到C++17)
大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。
范蠡
2021/07/16
1.5K0
基于C++实现的EventLoop与事件驱动编程
事件驱动编程(Event-Driven)是一种编码范式,常被应用在图形用户界面,应用程序,服务器开发等场景。
Coder-ZZ
2024/05/09
1.7K0
基于C++实现的EventLoop与事件驱动编程
C++舆情监控爬虫程序实现
如果用C++写一个舆情监控的爬虫程序。我们得要考虑C++在这方面的优势,比如性能高,适合处理大量数据。如果大家对C++的网络库不太熟悉,需要选择合适的库,比如libcurl或者Boost.Beast。然后得解析HTML,可能需要用到Gumbo或者类似的解析库。
华科云商小徐
2025/05/12
1040
如何在Native层设计一个消息队列
做过Android开发的同学对Handler、Looper、MessageQueue、Message应该是非常熟悉了,Android是一个基于消息驱动的系统,我们在日常开发中用到消息队列的地方非常多。Android也给我们封装好了一个强大易用的消息处理API,音视频开发核心逻辑都会放在Native层,我们也希望在C++层实现这样的消息队列。
马上就说
2022/05/25
4940
如何在Native层设计一个消息队列
[源码解析] 机器学习参数服务器ps-lite(2) ----- 通信模块Van
[源码解析] 机器学习参数服务器ps-lite 之(1) ----- PostOffice
罗西的思考
2021/08/06
1.1K0
相关推荐
C++11新特性之线程操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验