spring提供的登录j_spring_security_check

2023-11-10

第一步:form表单提交
<form id="formLogin" action="<%=request.getContextPath()%>/j_spring_security_check" method="post"></form>
第二步:配置文件applicationContext-security.xml
    <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.0.xsd">
    <!-- 认证功能http配置 -->
    <!-- entry-point-ref 为用户第一次访问受保护的url时的处理程序.  --> 
    <http use-expressions="true" entry-point-ref="authenticationEntryPoint">
        <!-- 这里是拒绝用户访问的处理程序 -->
        <access-denied-handler ref="accessDeniedHandler" />
        <intercept-url pattern="/login.jsp*" access="permitAll"/>
        <intercept-url pattern="/**/*.js" access="permitAll"/>
        <intercept-url pattern="/**/*.jpg" access="permitAll"/>
        <intercept-url pattern="/**/*.gif" access="permitAll"/>
        <intercept-url pattern="/**/*.css" access="permitAll"/>
        <intercept-url pattern="/**/**.json*" access="permitAll"/>
        <!-- <intercept-url pattern="/contents/**.jsp*" access="isAuthenticated()"/> -->
        <intercept-url pattern="/**/*.html*" access="permitAll"/>
        <intercept-url pattern="/**/*.jsp*" access="permitAll"/>
        <custom-filter position="LOGOUT_FILTER" ref="secLogoutFilter" />     
        <custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="checkInfoFilter" />
        <custom-filter position="FORM_LOGIN_FILTER" ref="crmAuthFilter" />
        <!-- 限制用户的最大登陆数,防止一个账号被多人使用 -->
        <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
        <session-management session-authentication-strategy-ref="crmSAS"/>
    </http>
      
    <!-- 登出 过滤器 -->
    <beans:bean id="secLogoutFilter"
        class="com.xxxx.crm.sec.common.SecLogoutFilter">
        <beans:constructor-arg ref="secLogoutSuccessHandler" />
        <beans:constructor-arg>
            <beans:list>
                <beans:bean
                    class="com.xxxx.crm.sec.common.SecLogoutHandler"></beans:bean>
            </beans:list>
        </beans:constructor-arg>
    </beans:bean>
      
    <!-- 登出 handler -->
    <beans:bean id="secLogoutSuccessHandler" class="com.xxxx.crm.sec.common.SecLogoutSuccessHandler">
        <beans:property name="defaultLogoutUrl" value="/login"></beans:property>
        <beans:property name="mLogoutUrl" value="/mlogin"></beans:property>
    </beans:bean>
      
    <!-- 登录失败 handler -->
    <beans:bean id="secAuthenticationFailureHandler" class="com.xxxx.crm.sec.common.SecAuthenticationFailureHandler">
        <beans:property name="defaultFailureUrl" value="/login"></beans:property>
        <beans:property name="customerFUrl" value="/login"></beans:property>
        <beans:property name="merchantFul" value="/mlogin"></beans:property>
    </beans:bean>
    <!-- 登录成功 handler -->
    <beans:bean id="secAuthenticationSuccessHandler " class="com.xxxx.crm.sec.common.SecAuthenticationSuccessHandler">
        <beans:property name="defaultSuccessUrl" value="/commonLogin"></beans:property>
    </beans:bean>
      
    <!-- userDetailsService -->
    <beans:bean id="userDetailsServiceImpl" class="com.xxxx.crm.sec.xxxxUserDetailsServiceImpl"></beans:bean>
    <!-- AccessDecisionManager -->
    <beans:bean id="accessDecision" class="com.xxxx.crm.sec.AccessDecisionManagerImpl"></beans:bean>
      
    <!-- FilterInvocationSecurityMetadataSource -->
    <beans:bean id="accessMeta" class="com.xxxx.crm.sec.SecurityMetadataSourceImpl"></beans:bean>
    <!-- 认证功能管理器 -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="authenticationProvider"/>
    </authentication-manager>
      
    <!-- 认证功能实现 -->
    <beans:bean id="authenticationProvider" class="com.xxxx.crm.sec.SecurityDaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDetailsServiceImpl" />
        <beans:property name="hideUserNotFoundExceptions" value="false"/>
        <beans:property name="passwordEncoder" ref="md5PasswordEncoder"/>
    </beans:bean>
      
    <!-- 用户动态设置session级别信息实现类  -->
    <beans:bean id="ctxSessionManager" class="com.xxxx.crm.sec.ctxsession.CtxSessionManager" />
      
    <!-- 用户密码加密或解密 -->
    <beans:bean id="md5PasswordEncoder" class="com.xxxx.crm.constance.MD5PasswordEncoder" /> 
    <beans:bean id="springMD5PasswordEncoder" class="com.xxxx.crm.constance.SpringMD5PasswordEncoder" />
    <beans:bean id="checkInfoFilter" class="com.xxxx.crm.sec.SecurityInterceptor">
        <beans:property name="authenticationManager" ref="authenticationManager" />
        <beans:property name="accessDecisionManager" ref="accessDecision" />
        <beans:property name="securityMetadataSource" ref="accessMeta" />
    </beans:bean>
      
    <!-- 定义上下文返回的消息的国际化。 -->
    <beans:bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!--<beans:property name="basename"
         value="classpath:org/springframework/security/messages_zh_CN"/>
         -->
        <beans:property name="basename"
        value="classpath:securityMessage_zh_CN"/>       
    </beans:bean>
      
    <!-- ConcurrentSession过滤器 -->
    <beans:bean id="concurrencyFilter"
        class="org.springframework.security.web.session.ConcurrentSessionFilter">
        <beans:property name="sessionRegistry" ref="sessionRegistry" />
        <beans:property name="expiredUrl" value="/login" />
    </beans:bean>
      
    <beans:bean id="crmSAS" class="com.xxxx.crm.sec.ConcurrentSessionControlStrategy">
    <beans:constructor-arg name="sessionRegistry"
        ref="sessionRegistry" />
    <beans:property name="maximumSessions" value="1" />
    </beans:bean>
      
   <beans:bean id="loginUserParamManager" class="com.xxxx.crm.sec.common.LoginUserParamManager" factory-method="getInstance">
        <!--是否启用重复登录控制 -->
        <beans:property name="checkSessions" value="false"/>
        <!--重复登录提示消息 -->
        <beans:property name="reloginMsg" value="当前用户已在其它地方登录。" />
    </beans:bean>
      
    <!-- CRM 权限过滤器 -->
    <beans:bean id="crmAuthFilter"
        class="com.xxxx.crm.sec.filter.AuthenticationFilter">
        <beans:property name="sessionAuthenticationStrategy"
            ref="crmSAS" />
        <beans:property name="authenticationManager" ref="authenticationManager" />
        <!-- <beans:property name="rememberMeServices" ref="rememberMeServices"></beans:property>-->
        <beans:property name="authenticationFailureHandler"
            ref="secAuthenticationFailureHandler" />
        <beans:property name="authenticationSuccessHandler"
            ref="secAuthenticationSuccessHandler" />
        <!-- <beans:property name="filterProcessesUrl" value="/ss_Login"></beans:property>  -->
    </beans:bean>
          
    <!-- SessionRegistryImpl -->
    <beans:bean id="sessionRegistry" class="com.xxxx.crm.sec.session.SecSessionRegistryImpl" />
      
    <!-- 访问切入点 -->
    <beans:bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/login" />
    </beans:bean>
      
    <!-- 认证被拒绝 -->
    <beans:bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
        <beans:property name="errorPage" value="/login" />
    </beans:bean>
      
</beans:beans>
第三步:成功处理类
public class xxxxUserDetailsServiceImpl implements UserDetailsService { 
    private UserDetails merchantDetails(String name) {
        Connection conn = null;
        try {
            conn = ds.getConnection();
            StringBuffer mString = new StringBuffer(1000);
            mString.append(
                    "SELECT COUNT(1) AS TOTLE FROM xxxx_MERCHANT_INFO T WHERE T.USER_NAME = '")
                    .append(name).append("'");
            Statement stsm = conn.createStatement();
            ResultSet rs = stsm.executeQuery(mString.toString());
            int count = 0;
            if (rs.next()) {
                count = rs.getInt("TOTLE");
            }
            if (count == 0) {
                rs.close();
                stsm.close();
                UsernameNotFoundException unfe = new UsernameNotFoundException(
                        "用户不存在或用户名错误");
                throw unfe;
            } else if (count > 1) {
                rs.close();
                stsm.close();
                UsernameNotFoundException unfe = new UsernameNotFoundException(
                        "用户信息配置错误");
                throw unfe;
            }
            mString.setLength(0);
            mString.append("SELECT MERCHANT_ID, USER_NAME, PASS_WORD, MERCHANT_NO, MERCHANT_NAME, EXPIRE_DATE, MERCHANT_ADDR, LINKMAN, LINK_PHONE, MAIL_ADDR, LEGAL_PERSON, MERCHANT_FULL_NAME, REGISTERED_CAPITAL, ORGANIZATION_CODE, MERCHANT_ORG, EVALUATION, STATUS, CREATED, CREATED_BY, UPDATED, UPDATED_BY FROM xxxx_MERCHANT_INFO ");
            mString.append("WHERE USER_NAME='").append(name).append("'");
            rs = stsm.executeQuery(mString.toString());
            xxxxUser<xxxxMerchantInfo> iAuser = null;
            if (rs.next()) {
                xxxxMerchantInfo info = new xxxxMerchantInfo();
                info.setUserName(rs.getString("USER_NAME"));
                info.setPassWord(rs.getString("PASS_WORD"));
                info.setMerchantId(rs.getString("MERCHANT_ID"));
                info.setMerchantNo(rs.getString("MERCHANT_NO"));
                info.setMerchantOrg(rs.getString("MERCHANT_ORG"));
                iAuser = new IxxxxMUser(info);
            }
            rs.close();
            stsm.close();
            return iAuser;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (null != conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}  
第四步:如果登录失败了页面需要提示
<%
  if (session.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION) != null) {
%>
  <input type="hidden" id="errorMsg" name="errorMsg" value='${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message}' />
<%
        } else {
%>
    <input type="hidden" id="errorMsg" name="errorMsg" value='' />
<%
        }
    session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
%>
在js里alert一下reeorMsg的值就可以了


本文出自 “小浩” 博客,请务必保留此出处http://zhangchi.blog.51cto.com/5214280/1389708

转载于:https://my.oschina.net/zhangshuge/blog/633825

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring提供的登录j_spring_security_check 的相关文章

随机推荐

  • 【C语言】统计素数并求和

    改名字了 2022 2 26之前叫 回到正题 由题可知 题目要求在用户自己输入的定整数M和N区间内求出素数的个数 并且对他们求和 要想解决编程题目 首先要知道题目问的是什么 素数一般指质数 质数是指在大于1的自然数中 除了1和它本身以外不再
  • 版本控制之最佳实践(Git版)

    现如今 应该每个开发者都在使用版本控制工具了吧 然而 如果你理解版本控制的基本规则 你便能更好地发挥它的效用 在此 我们汇总了一些最佳实践 希望你在使用Git做版本控制时能够了然于心 得心应手 1 相关的改动才放一起提交 一次提交 git
  • hi35 web服务器

    在hi3516A上移植好的boa嵌入式web服务器代码 boa有61k 一次只能处理一个请求 https download csdn net download ganxiaoyagn000 9239729 appweb Appweb 6 1
  • android 11 存储权限,Android 11存储权限强制申请

    private static final int REQUEST CODE 1024 private void requestPermission if Build VERSION SDK INT gt Build VERSION CODE
  • OC中的基本容器和基本数据类型

    基本数据类型 NSRange 是一个结构体 里面有两个数据成员数据类型都为NSUInteger 就是c语言中的无符号整形 一个是location表示集合的起始地址 另外一个变量是length表示从起始地址开始算多少个元素 NSRange的三
  • CTF-web 简介

    web部分是CTF的重要组成部分之一 素有WEB大魔王之称 题目种类繁多 关键是如何发现漏洞的类型和怎样构造特殊的负载绕过过滤 CTF分为三种模式 解题模式 攻防模式 混合模式 在线工具 https www ctftools com dow
  • JVM运行时数据区

    文章目录 JVM内存结构图 1 运行时数据区域 JDK 1 7 JDK 1 8 1 线程栈 虚拟机栈 2 本地方法栈 3 程序计数器 4 方法区 元空间 5 堆 6 运行时常量池 Runtime Constant Pool 7 直接内存 D
  • 新版MetaMask如何获取当前账户地址

    window addEventListener load async gt Modern dapp browsers if window ethereum let ethereum window ethereum window web3 n
  • C语言中 -> 和 . 的区别

    在C语言中 gt 和 都是用于访问结构体 struct 成员的运算符 但它们的使用场景略有不同 1 gt 运算符用于访问结构体指针的成员 当你有一个指向结构体的指针时 你可以使用 gt 运算符来访问该结构体的成员 例如 struct Per
  • Linux使用第三方库链接的使用方式——静态式

    目录 二 第三方库为静态库时 方法1 两个窗口去分别模拟两个窗口公司A 客户端 公司B 服务端 的视角案例实现 提前插播一条指令 生成静态库文件的指令 方法2 优化 该方法在上述方法1的第10步后开始进行 这里强调一个问题 今天我们来学习将
  • 记录一个AFR去嵌S参数异常的案例。

    最近在使用AFR去嵌一个S参数的时候 遇到了如下问题 首先介绍一下这个S参数 一端是MCIO连接器 另一端是CEM连接器 所以测试的时候一端接MCIO测试治具 一端接CEM测试治具 再通过线缆将测试治具连接到VNA上 我大概画了一个简图如下
  • Java 输出机制 数据类型 基本数据类型转换 基本数据类型和String类型的转换

    目录 一 输出机制 1 print和println的差别 2 可接收不同类型参数 3 输出函数中 符号的使用 二 数据类型 1 整型类型 2 浮点类型 3 字符类型 三 基本数据类型转换 1 自动类型转换 2 强制类型转换 3 练习题 四
  • 目标检测算法回顾之发展概览

    目标检测算法的发展时间线 发展历史轴 时间轴线图 算法方法概览 思维导图 说明 本文仅供学习 发展历史轴 时间轴线图 目标检测的算法发展可以追溯到很久之前 这里我根据前两年的综述论文加上这两年的发展也画了两个部分的相关模型发展轴 可以看到
  • linux命令之ssh详解

    ssh openssh套件中的客户端连接工具 Linux在线工具 linux命令在线工具 个人博客网站 博客 Java17中文文档 JDK17中文手册 Gradle8 1 1中文文档 Gradle中文文档 补充说明 ssh命令 是opens
  • (转载)Linux 系统内核的调试

    调试是软件开发过程中一个必不可少的环节 在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题 但是 Linux 系统的开发者出于保证内核代码正确性的考虑 不愿意在 Linux 内核源代码树中加入一个调试器 他们认为内核中的调
  • PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)

    实现原理 进入那些状态不正常的小程序会被重定向至一个Url 使用抓包软件抓取这个Url 剔除不必要参数 使用cURl函数请求网页获得HTML内容 根据内容解析出当前APPID的小程序的状态 代码
  • thrust库学习(一) —— cub::DeviceRadixSort

    1 cub DeviceRadixSort 1 1 介绍 DeviceRadixSort提供设备范围内的并行操作 用于跨驻留在设备可访问内存中的数据项序列计算基数排序 基数排序方法按升序 或降序 排列项目 该算法依赖于键的位置表示 即每个键
  • LeetCode-动态规划-路径的数目

    1 题目 剑指 Offer II 098 路径的数目 62 不同路径 2 实现 class Solution public vector
  • 原生js方法小记

    ps 无框架时 使用js的一些功能完成一些小demo 记录方法 方便自己查询 原生js方法小记 String 和Array 方法 替换所有 追加replaceAll方法 String prototype replaceAll functio
  • spring提供的登录j_spring_security_check

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第一步 form表单提交