作者

接前讲,首先针对一个多种用户类型的登录需求,需要先实现多种用户类型的登录界面的展示,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. mysql报错 常见 1045 10061

    报错1045: 远程没有设置用户远程访问的权限 解决方案: 进行授权(红色是你的密码) 如果想root用户使用password从任何主机连接到mysql服务器的话. GRANT ALL PRIVILE ...

  2. 引用类型前需要加ref?

    方法的参数前加ref代表的是传的参数的地址,值类型前加ref的作用相当于把这个值类型当成引用类型在用,那引用类型作为参数有一种情况也需要加ref,不然得到的值会有差. 不加ref: class Pro ...

  3. PHP 跨域资源共享 CORS 设定

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...

  4. 测试函数——python编程从入门到实践

    测试函数 学习测试,得有测试的代码.下面是一个简单的函数: name_function.py def get_formatted_name(first, last): ""&quo ...

  5. adminLTE2.4.18 bootstrap3 左侧菜单高亮

    adminLTE2.4.18  bootstrap3  左侧菜单高亮 //菜单 $(function(){ console.log('eeeeeeeeee'); $('.sidebar-menu li ...

  6. vue3 createComponent

    这个函数不是必须的,除非你想要完美结合 TypeScript 提供的类型推断来进行项目的开发. 这个函数仅仅提供了类型推断,方便在结合 TypeScript 书写代码时,能为 setup() 中的 p ...

  7. 笔记:npm常见错误

    常见错误 破坏的npm安装 随机错误 找不到兼容版本 权限错误 Error: ENOENT, stat 'C:\Users\<user>\AppData\Roaming\npm' 在Win ...

  8. 【1】【leetcode-72 动态规划】 编辑距离

    (没思路,很典型,重要) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替 ...

  9. Redis AOF持久化(二)

    1.AOF持久化的配置 AOF持久化,默认是关闭的,默认是打开RDB持久化 appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的 ...

  10. 【前端】将前台table数据导出excel表格

    1.首先引用jquery以及table2excel <script type="text/javascript" src="js/jquery.table2exce ...