Spring Security 3多用户登录实现之二 多登录界面展示
接前讲,首先针对一个多种用户类型的登录需求,需要先实现多种用户类型的登录界面的展示,Spring Security提供了这样一个接口来帮助我们实现多种用户类型的登录界面的展示,这个接口就是AuthenticationEntryPoint, 实现这样一个接口,我们就可以随心所欲的控制登录界面的展示了,当我们访问一个受权限的资源,而当前又没有权限访问时,Spring Security就会将处理导向这个接口的实现。针对前讲我所提到的需求,在这里我将实现前台用户和后台用户登录界面的展示,先来看看我的源码实现吧,在这里为了实现多用户类型的登录,很多场景我都需要根据相应的请求参数或地址来判断我需要导向哪个URL地址,我在这里特实现了一个共用的接口和类,接口名为DirectUrlResolver。
- package com.template.security.shared;
- import javax.servlet.http.HttpServletRequest;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 12-11-9
- * Time: 下午7:11
- */
- public interface DirectUrlResolver {
- boolean support(HttpServletRequest request);
- String directUrl();
- }
- package com.template.security.shared;
- import javax.servlet.http.HttpServletRequest;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 12-11-9
- * Time: 下午7:12
- */
- public abstract class AbstractDirectUrlResolver implements DirectUrlResolver {
- protected String pattern;
- protected String directUrl;
- @Override
- public abstract boolean support(HttpServletRequest request);
- @Override
- public String directUrl() {
- return this.directUrl;
- }
- public void setPattern(String pattern) {
- this.pattern = pattern;
- }
- public void setDirectUrl(String directUrl) {
- this.directUrl = directUrl;
- }
- }
- package com.template.security.shared;
- import com.template.utils.StringUtils;
- import javax.servlet.http.HttpServletRequest;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 12-11-9
- * Time: 下午7:13
- */
- public class RequestParameterDirectUrlResolver extends AbstractDirectUrlResolver {
- private String parameterName;
- @Override
- public boolean support(HttpServletRequest request) {
- String parameterValue = request.getParameter(parameterName);
- if (StringUtils.isEmpty(parameterValue)) {
- return false;
- }
- return parameterValue.equals(this.pattern);
- }
- public void setParameterName(String parameterName) {
- this.parameterName = parameterName;
- }
- }
- package com.template.security.shared;
- import javax.servlet.http.HttpServletRequest;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 12-11-9
- * Time: 下午7:13
- */
- public class RequestUriDirectUrlResolver extends AbstractDirectUrlResolver {
- @Override
- public boolean support(HttpServletRequest request) {
- String requestURI = request.getRequestURI();
- return requestURI.contains(this.pattern);
- }
- }
RequestParameterDirectUrlResolver和RequestUriDirectUrlResolver都实现了DirectUrlResolver这样一个接口,前者的实现是根据相应请求中的参数来判断, 而后者的实现是根据相应的请求地址来判断。
现在让我们来看看如何通过实现AuthenticationEntryPoint接口来控制什么时候展示前台登录界面,什么时候展示后台登录界面的吧。
- package com.template.security.login;
- import com.template.security.shared.DirectUrlResolver;
- import org.springframework.security.core.AuthenticationException;
- import org.springframework.security.web.AuthenticationEntryPoint;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 12-11-9
- * Time: 下午7:40
- */
- public class MultipleAuthenticationLoginEntry implements AuthenticationEntryPoint {
- private String defaultLoginUrl;
- private List<DirectUrlResolver> directUrlResolvers = new ArrayList<DirectUrlResolver>();
- @Override
- public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
- for (DirectUrlResolver directUrlResolver : directUrlResolvers) {
- if (directUrlResolver.support(request)) {
- String loginUrl = directUrlResolver.directUrl();
- response.sendRedirect(loginUrl);
- return;
- }
- }
- response.sendRedirect(defaultLoginUrl);
- }
- public void setDefaultLoginUrl(String defaultLoginUrl) {
- this.defaultLoginUrl = defaultLoginUrl;
- }
- public void setDirectUrlResolvers(List<DirectUrlResolver> directUrlResolvers) {
- this.directUrlResolvers = directUrlResolvers;
- }
- }
再来看看在Spring配置文件中是如何对相应的登录入口进行配置的
- <beans:bean id="multipleAuthenticationLoginEntry"
- class="com.template.security.login.MultipleAuthenticationLoginEntry">
- <beans:property name="defaultLoginUrl" value="/backend/login"/>
- <beans:property name="directUrlResolvers">
- <beans:list>
- <beans:ref bean="backendLoginEntry"/>
- <beans:ref bean="forendLoginEntry"/>
- </beans:list>
- </beans:property>
- </beans:bean>
- <beans:bean id="backendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
- <beans:property name="pattern" value="/backend"/>
- <beans:property name="directUrl" value="/backend/login"/>
- </beans:bean>
- <beans:bean id="forendLoginEntry" class="com.template.security.shared.RequestUriDirectUrlResolver">
- <beans:property name="pattern" value="/forend"/>
- <beans:property name="directUrl" value="/forend/login"/>
- </beans:bean>
这里我是根据请求的地址中是否包括backend或forend来判断用户是进行前台登录或后台登录的, 这可以从配置文件中的backendLoginEntry和forendLoginEntry中的pattern属性看出,这个pattern的作用就是判断用户是进行前台登录或后台登录的依据,而directUrl则是我们想要导向的登录界面地址。
Spring Security 3多用户登录实现之二 多登录界面展示的更多相关文章
- 【手摸手,带你搭建前后端分离商城系统】03 整合Spring Security token 实现方案,完成主业务登录
[手摸手,带你搭建前后端分离商城系统]03 整合Spring Security token 实现方案,完成主业务登录 上节里面,我们已经将基本的前端 VUE + Element UI 整合到了一起.并 ...
- Spring Security笔记:使用BCrypt算法加密存储登录密码
在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spr ...
- Spring Security框架下实现两周内自动登录"记住我"功能
本文是Spring Security系列中的一篇.在上一篇文章中,我们通过实现UserDetailsService和UserDetails接口,实现了动态的从数据库加载用户.角色.权限相关信息,从而实 ...
- Spring Security源码解析一:UsernamePasswordAuthenticationFilter之登录流程
一.前言 spring security安全框架作为spring系列组件中的一个,被广泛的运用在各项目中,那么spring security在程序中的工作流程是个什么样的呢,它是如何进行一系列的鉴权和 ...
- Spring Security构建Rest服务-1001-spring social开发第三方登录之spring social基本原理
OAuth协议是一个授权协议,目的是让用户在不将服务提供商的用户名密码交给第三方应用的条件下,让第三方应用可以有权限访问用户存在服务提供商上的资源. 接着上一篇说的,在第三方应用获取到用户资源后,如果 ...
- Spring Security 实战干货:图解用户是如何登录的
1. 前言 欢迎阅读Spring Security 实战干货系列文章,在集成Spring Security安全框架的时候我们最先处理的可能就是根据我们项目的实际需要来定制注册登录了,尤其是Http登录 ...
- Spring Security构建Rest服务-0102-Spring Social开发第三方登录之qq登录
图一 基于SpringSocial实现qq登录,要走一个OAuth流程,拿到服务提供商qq返回的用户信息. 由上篇介绍的可知,用户信息被封装在了Connection里,所以最终要拿到Connectio ...
- ros有一个比较安全的登录方案:二次登录防火墙
原文: https://www.winbox.org/ /ip firewall address-list add address=10.0.0.0/8 list=login /ip firewall ...
- Spring Security 自定义登录认证(二)
一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Se ...
随机推荐
- HBase 详解
1.HBase 架构 ============================================ 2. HBase Shell 操作 2.1. 基本操作 进入HBase客户端命令行:bi ...
- 关于docker的scratch镜像与helloworld
关于docker的scratch镜像与helloworld 参考:https://hub.docker.com/_/scratch?tab=description 参考:https://segment ...
- 处理登录时,AJAX的状态码无权限情况
$.ajaxSetup({ complete: function(XMLHttpRequest, textStatus) { }, error:function(jqXHR,textStatus,er ...
- IntelliJ IDEA 常用快捷键 之 Windows 版
IntelliJ IDEA(简称 IDEA),是 Java 语言开发的集成环境,IDEA 在业界被公认为最好的 Java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持.各类版本 ...
- [转帖]linux下安装7z命令及7z命令的使用
linux下安装7z命令及7z命令的使用 https://www.cnblogs.com/yiwd/p/3649094.html yum install p7zip 执行命令为 7za x 或者是 7 ...
- XXE任意文件读取(当xml解析内容有输出时)
利用XXE漏洞读取文件 参考:https://www.jianshu.com/p/4fc721398e97 首先找到登录源码如下: 由题目可以利用XXE漏洞读取文件 先登录用Burp Suite抓包: ...
- gRPC-拦截器简单使用
概述 gRPC作为通用RPC框架,内置了拦截器功能.包括服务器端的拦截器和客户端拦截器,使用上大同小异.主要作用是在rpc调用的前后进行额外处理. 从客户端角度讲,可以在请求发起前,截取到请求参数并修 ...
- robotframework_酷我音乐_That Girl
*** Settings *** Library Selenium2Library *** Test Cases *** music # 打开浏览器 Open Browser https://www. ...
- springBoot入门到精通-Simple
https://blog.csdn.net/zhiyikeji/article/details/84346189 1.springBoot前期准备 1.环境配置:jdk,maven 2.编写工具:st ...
- springboot使用HttpSessionListener 监听器统计当前在线人数
概括: request.getSession(true):若存在会话则返回该会话,否则新建一个会话. request.getSession(false):若存在会话则返回该会话,否则返回NULL ht ...