博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在spring security手动 自定义 用户认证 SecurityContextHolder
阅读量:6425 次
发布时间:2019-06-23

本文共 2573 字,大约阅读时间需要 8 分钟。

hot3.png

1.Spring Security 目前支持认证一体化如下认证技术:

HTTP BASIC authentication headers (一个基于IEFT  RFC 的标准)

HTTP Digest authentication headers (一个基于IEFT  RFC 的标准)
HTTP X.509 client certificate exchange  (一个基于IEFT RFC 的标准)
(一个非常常见的跨平台认证需要做法,特别是在大环境)
Form-based authentication (提供简单用户接口的需求)
OpenID authentication
Computer Associates Siteminder
Central Authentication Service  (CAS,这是一个流行的开源单点登录系统)
Transparent authentication context  propagation for Remote Method Invocation and HttpInvoker  (一个Spring远程调用协议)

2.但是有时不想使用这些认证,需要自定义用户认证

   2.1 代码如下:

//从spring容器中获取UserDetailsService(这个从数据库根据用户名查询用户信息,及加载权限的service)      UserDetailsService userDetailsService =             (UserDetailsService)SpringContextUtil.getBean("userDetailsService");            //根据用户名username加载userDetails      UserDetails userDetails = userDetailsService.loadUserByUsername(username);            //根据userDetails构建新的Authentication,这里使用了      //PreAuthenticatedAuthenticationToken当然可以用其他token,如UsernamePasswordAuthenticationToken                     PreAuthenticatedAuthenticationToken authentication =             new PreAuthenticatedAuthenticationToken(userDetails, userDetails.getPassword(),userDetails.getAuthorities());            //设置authentication中details      authentication.setDetails(new WebAuthenticationDetails(request));            //存放authentication到SecurityContextHolder      SecurityContextHolder.getContext().setAuthentication(authentication);      HttpSession session = request.getSession(true);      //在session中存放security context,方便同一个session中控制用户的其他操作      session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

2.2 方法userDetailsService.loadUserByUsername(username) 如下:

/**      * 获取用户Details信息的回调函数.      */      public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException,DataAccessException {          GeOperator geOperator = geOperatorService.findOperatorByPK(username);          if(geOperator == null){              throw new UsernameNotFoundException("","用户名错误");          }          //加载该用户权限          Set
grantedAuths = obtainGrantedAuthorities(geOperator); boolean enabled = true; boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; UserDetails userdetails = new MisUser(username, geOperator.getPwd(), geOperator, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuths); return userdetails; }

参考问题:

转载于:https://my.oschina.net/lemonzone2010/blog/268452

你可能感兴趣的文章
SAP QM Batch to Batch的转移过账事务中的Vendor Batch
查看>>
本期最新 9 篇论文,帮你完美解决「读什么」的问题 | PaperDaily #19
查看>>
图解SSIS监视文件夹并自动导入数据
查看>>
Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
查看>>
MyBatis Review——开发Dao的方法
查看>>
技术研发国产化进程加快 看传感器企业如何展示十八般武艺
查看>>
技术助力第三次革命
查看>>
《HTML与CSS入门经典(第8版)》——2.6 总结
查看>>
新手指南:在 Ubuntu 和 Fedora 上安装软件包
查看>>
在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
查看>>
大型网站的 HTTPS 实践(二):HTTPS 对性能的影响
查看>>
《Swift 权威指南》——第6章,第6.10节嵌套函数
查看>>
《自己动手做交互系统》——1.3 本章小结
查看>>
Mobile devices bundled with malware?
查看>>
《JavaScript面向对象精要》——1.5 访问属性
查看>>
《Python数据可视化编程实战》—— 第 1 章 准备工作环境
查看>>
Android应用性能优化最佳实践.1.1 Android Studio的优势
查看>>
《设计模式解析(第2版•修订版)》—第2章 2.2节什么是UML
查看>>
【直播】APP全量混淆和瘦身技术揭秘
查看>>
10个大坑,当你产品上架AppStore会遇到
查看>>