作者

接前讲,首先针对一个多种用户类型的登录需求,需要先实现多种用户类型的登录界面的展示,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. DDD分层架构的三种模式

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...

  2. 分布式session一致性

    实现思路:当客户端发送请求到服务端后,在后台生成一个token,将token作为key,用户状态信息作为value,存入redis缓存中,并设置过期时间,最后把token返回给客户端 客户端第会保存t ...

  3. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  4. Spring整合Hibernate的两种方式

    在使用spring注解整合hibernate时出现"org.hibernate.MappingException: Unknown entity: com.ssh.entry.Product ...

  5. ComPtr的介绍以及使用

    ComPtr是为COM而设计的智能指针.它支持WindowsRT,也支持传统Win32.相比ATL里的CComPtr类,它有了一些提升. ComPtr包含在Windows 8.x SDK and Wi ...

  6. python爬虫-有道翻译-js加密破解

    有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...

  7. 解决vue-cli项目开发中跨域问题

    一.开发环境中跨域 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问非本机上的接口http://10.1.0.34:8000/queryRole.不同域名之间的访问 ...

  8. koa2--session的实现

    koa2原生功能只提供了cookie的操作,但是没有提供session操作.session只能自己实现或者通过第三方中间件实现. 如果session数据量很小,可以直接存在内存中 如果session数 ...

  9. ABAP-JCO服务错误

    1.错误如下图,需SM59调整Unicode,保持JCO服务启动时与SAP-SM59设置Unicode一致.

  10. EVM靶机渗透

    前言 靶机下载地址: https://download.vulnhub.com/norzhctf/Basilic.ova 通过渗透靶机来学习相关知识以便提高在真实环境的渗透能力 ==. 安装: 我是用 ...