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 ...
随机推荐
- SQL Server 参数嗅探问题
摘要 MSSQL Server参数嗅探既是一个涉及知识面非常广泛,又是一个比较难于解决的课题,即使对于数据库老手也是一个比较头痛的问题.这篇文章从参数嗅探是什么,如何产生,表象是什么,会带来哪些问题, ...
- python入门基础 03
整型 -- 数字 (int) 用于比较和运算的 32位 -2 ** 31 -1 ~ 2 ** 31 -1 64位 -2 ** 63 -1 ~ 2 ** 63 -1 + - * / // ** % &q ...
- ubuntu Docker安装部署Rancher
一.Rancher简介 Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台.Rancher提供了在生产环境中使用的管理Dock ...
- Spring-Cloud之Feign声明式调用-4
一.Feign受Retrofit.JAXRS-2.0和WebSocket影响,采用了声明式API 接口的风格,将Java Http 客户端绑定到它的内部. Feign 首要目的是将 Java Http ...
- RSA非对称 私钥加密
RSA生成公钥和私钥对 /// <summary> /// RSA生成公钥和私钥 /// </summary> /// <returns></returns& ...
- 矩量母函数(Moment Generating Function,mgf,又称:动差生成函数)
在统计学中,矩又被称为动差(Moment).矩量母函数(Moment Generating Function,简称mgf)又被称为动差生成函数. 称exp(tξ)的数学期望为随机变量ξ的矩量母函数,记 ...
- 2019 东方明珠java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东方明珠等公司offer,岗位是Java后端开发,最终选择去了东方明珠. 面试了很多家公司,感觉大部分公司考察的点 ...
- QueryDSL-JPA
QueryDSL-JPA QueryDSL简介 官网 1 QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询. 2 Querydsl可以通过一组通用的查询AP ...
- 基于xilinx Zynq UltraScale MPSoC平台的核心板及开发板介绍-米尔科技
近日,米尔科技推出国内首款基于xilinx Zynq UltraScale+MPSoC 平台的核心板及开发板.其优势主要有:采用16纳米制程,相比Znyq7000系列每瓦性能提升5倍,且单芯片融合4核 ...
- css 三角形空心三角形的简单实现
<style> #talkbubble { width: 120px; height: 80px; position: relative; -moz-border-radius: 10px ...