作者

接前讲,首先针对一个多种用户类型的登录需求,需要先实现多种用户类型的登录界面的展示,Spring Security提供了这样一个接口来帮助我们实现多种用户类型的登录界面的展示,这个接口就是AuthenticationEntryPoint, 实现这样一个接口,我们就可以随心所欲的控制登录界面的展示了,当我们访问一个受权限的资源,而当前又没有权限访问时,Spring Security就会将处理导向这个接口的实现。针对前讲我所提到的需求,在这里我将实现前台用户和后台用户登录界面的展示,先来看看我的源码实现吧,在这里为了实现多用户类型的登录,很多场景我都需要根据相应的请求参数或地址来判断我需要导向哪个URL地址,我在这里特实现了一个共用的接口和类,接口名为DirectUrlResolver。

  1. package com.template.security.shared;
  2. import javax.servlet.http.HttpServletRequest;
  3. /**
  4. * Created by IntelliJ IDEA.
  5. * User: Zhong Gang
  6. * Date: 12-11-9
  7. * Time: 下午7:11
  8. */
  9. public interface DirectUrlResolver {
  10. boolean support(HttpServletRequest request);
  11. String directUrl();
  12. }
  1. package com.template.security.shared;
  2. import javax.servlet.http.HttpServletRequest;
  3. /**
  4. * Created by IntelliJ IDEA.
  5. * User: Zhong Gang
  6. * Date: 12-11-9
  7. * Time: 下午7:12
  8. */
  9. public abstract class AbstractDirectUrlResolver implements DirectUrlResolver {
  10. protected String pattern;
  11. protected String directUrl;
  12. @Override
  13. public abstract boolean support(HttpServletRequest request);
  14. @Override
  15. public String directUrl() {
  16. return this.directUrl;
  17. }
  18. public void setPattern(String pattern) {
  19. this.pattern = pattern;
  20. }
  21. public void setDirectUrl(String directUrl) {
  22. this.directUrl = directUrl;
  23. }
  24. }
  1. package com.template.security.shared;
  2. import com.template.utils.StringUtils;
  3. import javax.servlet.http.HttpServletRequest;
  4. /**
  5. * Created by IntelliJ IDEA.
  6. * User: Zhong Gang
  7. * Date: 12-11-9
  8. * Time: 下午7:13
  9. */
  10. public class RequestParameterDirectUrlResolver extends AbstractDirectUrlResolver {
  11. private String parameterName;
  12. @Override
  13. public boolean support(HttpServletRequest request) {
  14. String parameterValue = request.getParameter(parameterName);
  15. if (StringUtils.isEmpty(parameterValue)) {
  16. return false;
  17. }
  18. return parameterValue.equals(this.pattern);
  19. }
  20. public void setParameterName(String parameterName) {
  21. this.parameterName = parameterName;
  22. }
  23. }
  1. package com.template.security.shared;
  2. import javax.servlet.http.HttpServletRequest;
  3. /**
  4. * Created by IntelliJ IDEA.
  5. * User: Zhong Gang
  6. * Date: 12-11-9
  7. * Time: 下午7:13
  8. */
  9. public class RequestUriDirectUrlResolver extends AbstractDirectUrlResolver {
  10. @Override
  11. public boolean support(HttpServletRequest request) {
  12. String requestURI = request.getRequestURI();
  13. return requestURI.contains(this.pattern);
  14. }
  15. }

RequestParameterDirectUrlResolver和RequestUriDirectUrlResolver都实现了DirectUrlResolver这样一个接口,前者的实现是根据相应请求中的参数来判断, 而后者的实现是根据相应的请求地址来判断。

现在让我们来看看如何通过实现AuthenticationEntryPoint接口来控制什么时候展示前台登录界面,什么时候展示后台登录界面的吧。

  1. package com.template.security.login;
  2. import com.template.security.shared.DirectUrlResolver;
  3. import org.springframework.security.core.AuthenticationException;
  4. import org.springframework.security.web.AuthenticationEntryPoint;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * Created by IntelliJ IDEA.
  13. * User: Zhong Gang
  14. * Date: 12-11-9
  15. * Time: 下午7:40
  16. */
  17. public class MultipleAuthenticationLoginEntry implements AuthenticationEntryPoint {
  18. private String defaultLoginUrl;
  19. private List<DirectUrlResolver> directUrlResolvers = new ArrayList<DirectUrlResolver>();
  20. @Override
  21. public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
  22. for (DirectUrlResolver directUrlResolver : directUrlResolvers) {
  23. if (directUrlResolver.support(request)) {
  24. String loginUrl = directUrlResolver.directUrl();
  25. response.sendRedirect(loginUrl);
  26. return;
  27. }
  28. }
  29. response.sendRedirect(defaultLoginUrl);
  30. }
  31. public void setDefaultLoginUrl(String defaultLoginUrl) {
  32. this.defaultLoginUrl = defaultLoginUrl;
  33. }
  34. public void setDirectUrlResolvers(List<DirectUrlResolver> directUrlResolvers) {
  35. this.directUrlResolvers = directUrlResolvers;
  36. }
  37. }

再来看看在Spring配置文件中是如何对相应的登录入口进行配置的

  1. <beans:bean id="multipleAuthenticationLoginEntry"
  2. class="com.template.security.login.MultipleAuthenticationLoginEntry">
  3. <beans:property name="defaultLoginUrl" value="/backend/login"/>
  4. <beans:property name="directUrlResolvers">
  5. <beans:list>
  6. <beans:ref bean="backendLoginEntry"/>
  7. <beans:ref bean="forendLoginEntry"/>
  8. </beans:list>
  9. </beans:property>
  10. </beans:bean>
  11. <beans:bean id="backendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
  12. <beans:property name="pattern" value="/backend"/>
  13. <beans:property name="directUrl" value="/backend/login"/>
  14. </beans:bean>
  15. <beans:bean id="forendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
  16. <beans:property name="pattern" value="/forend"/>
  17. <beans:property name="directUrl" value="/forend/login"/>
  18. </beans:bean>

这里我是根据请求的地址中是否包括backend或forend来判断用户是进行前台登录或后台登录的, 这可以从配置文件中的backendLoginEntry和forendLoginEntry中的pattern属性看出,这个pattern的作用就是判断用户是进行前台登录或后台登录的依据,而directUrl则是我们想要导向的登录界面地址。

Spring Security 3多用户登录实现之二 多登录界面展示的更多相关文章

  1. 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录

    [手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...

  2. Spring Security笔记:使用BCrypt算法加密存储登录密码

    在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spr ...

  3. Spring Security框架下实现两周内自动登录"记住我"功能

    本文是Spring Security系列中的一篇.在上一篇文章中,我们通过实现UserDetailsService和UserDetails接口,实现了动态的从数据库加载用户.角色.权限相关信息,从而实 ...

  4. Spring Security源码解析一:UsernamePasswordAuthenticationFilter之登录流程

    一.前言 spring security安全框架作为spring系列组件中的一个,被广泛的运用在各项目中,那么spring security在程序中的工作流程是个什么样的呢,它是如何进行一系列的鉴权和 ...

  5. Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理

    OAuth协议是一个授权协议,目的是让用户在不将服务提供商的用户名密码交给第三方应用的条件下,让第三方应用可以有权限访问用户存在服务提供商上的资源. 接着上一篇说的,在第三方应用获取到用户资源后,如果 ...

  6. Spring Security 实战干货:图解用户是如何登录的

    1. 前言 欢迎阅读Spring Security 实战干货系列文章,在集成Spring Security安全框架的时候我们最先处理的可能就是根据我们项目的实际需要来定制注册登录了,尤其是Http登录 ...

  7. Spring Security构建Rest服务-0102-Spring Social开发第三方登录之qq登录

    图一 基于SpringSocial实现qq登录,要走一个OAuth流程,拿到服务提供商qq返回的用户信息. 由上篇介绍的可知,用户信息被封装在了Connection里,所以最终要拿到Connectio ...

  8. ros有一个比较安全的登录方案:二次登录防火墙

    原文: https://www.winbox.org/ /ip firewall address-list add address=10.0.0.0/8 list=login /ip firewall ...

  9. Spring Security 自定义登录认证(二)

    一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...

随机推荐

  1. Html 对象的常用事件列举

    事件名称 触发时间 对象例举 OnBlur 对象失去输入焦点 窗口和所有的表单对象 OnChange 用户改变对象的值 文本框.文本区域.选择列表等 OnClick 用户鼠标点击 链接.按钮.单选钮. ...

  2. 部署.Net Core APi+Vue 到 linux centos 服务器(一)

    部署.Net Core APi+Vue 到 linux centos 服务器(一) 前言:项目采用的是 .net core 作为接口,vue作为前端. 此时需要把整个项目架设到linux centos ...

  3. 记一次redis主从同步失败

    zabbix告警突然从某个时间点开始提示CPU使用高,网卡流量也一直居高不下. 首先查看redis日志,发现告警时间点redis主节点被重启了,发生了主备切换,并且在日志中发现这么一段 [3081] ...

  4. Oracle数据库 常用的触发器命令

    创建自增序列,创建触发器(在触发时间中操纵序列,实现主键自增): Oracle数据库不支持自增方法 create sequence seq_userInfo_usid start with ;--创建 ...

  5. C# vb .net实现装饰边框效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的装饰边框效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  6. 2019 浪潮java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.浪潮等公司offer,岗位是Java后端开发,因为发展原因最终选择去了浪潮,入职一年时间了,之前面试了很多家公 ...

  7. 自学Python编程的第五天(希望有IT大牛帮我看最下面的代码)----------来自苦逼的转行人

    2019-09-15-15:40:24 今天没有学知识,是一个一周总结,把这一周学的知识总结一遍,然后把做过的练习题再做一遍 看是否还会有再出现同样的错误,而且还可以知道有哪些知识点没有掌握好,可以把 ...

  8. Flutter — IDE Shortcuts for Faster Development

    https://medium.com/flutter-community/flutter-ide-shortcuts-for-faster-development-2ef45c51085b If yo ...

  9. vue动态加载不同的组件(分内部和外部组件)

    <!DOCTYPE html> <html> <head> <title> hello world vue </title> <met ...

  10. 手写MQ框架(三)-客户端实现

    一.背景 书接手写MQ框架(二)-服务端实现  ,前面介绍了服务端的实现.但是具体使用框架过程中,用户肯定是以客户端的形式跟服务端打交道的.客户端的好坏直接影响了框架使用的便利性. 虽然框架目前是通过 ...