文档章节

spring security登录校验时检查图片验证码

抢地主
 抢地主
发布于 2017/05/23 10:04
字数 703
阅读 69
收藏 0

 

spring security登录时校验用户名、密码、图片验证码 3个要素的一个例子。

1、配置登录权限管理及登录过滤。 

spring_security.xml源码:
 

[code]<?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" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-4.2.xsd         http://www.springframework.org/schema/security         http://www.springframework.org/schema/security/spring-security-4.0.xsd">     <http auto-config="true">
        <!-- 
            若启用跨域请求遗忘机制,<csrf disabled="false" />
            则所有的请求都要加上 csrf令牌,如 login.zul:
            <html:form action="/LMemo/login" method="POST" xmlns:html="native">
                <textbox name="${_csrf.parameterName}" value="${_csrf.token}" />
                ...
            </html:form>
            但是 zk引擎的系统请求(/zkau/**)就会无效。
         -->
        <csrf disabled="true" />
        <!-- zk引擎请求不需要登录 -->
        <intercept-url pattern="/zkau/**" access="permitAll" />
        <!-- 登录、注册页不需要登录 -->
        <intercept-url pattern="/view/login.zul" access="permitAll" />
        <intercept-url pattern="/view/register.zul" access="permitAll" />
        <!-- 需要登录 -->
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <!-- 登录过滤 -->
        <custom-filter ref="loginFilter" before="FORM_LOGIN_FILTER" />
        <!-- 登录 -->
        <form-login
            always-use-default-target="true"
            authentication-failure-url="/view/login.zul?login_error=1"
            default-target-url="/view/memo_main.zul"
            login-page="/view/login.zul"
            login-processing-url="/login"
            password-parameter="password"
            username-parameter="username" />
        <!-- 退出 -->
        <logout
            logout-url="/logout"
            logout-success-url="/view/login.zul" />
    </http>       
    <!-- 权限管理 -->
    <authentication-manager id="authenticationManager">
        <authentication-provider user-service-ref="memoUserDetailsServiceImpl">
            <password-encoder hash="plaintext" />
        </authentication-provider>
    </authentication-manager>
     <!-- 全局方法安全 -->
    <global-method-security pre-post-annotations="enabled" />
    <!-- 登录过滤 -->
    <beans:bean id="loginFilter" class="me.linkwork.lmemo.filter.SecuriyLoginFilter">
        <beans:property name="authenticationManager"  ref="authenticationManager"></beans:property>
        <beans:property name="authenticationSuccessHandler">
            <beans:bean class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
                <beans:property name="defaultTargetUrl" value="/view/memo_main.zul"></beans:property>
            </beans:bean>
        </beans:property>
        <beans:property name="authenticationFailureHandler">
            <beans:bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
                <beans:property name="defaultFailureUrl" value="/view/login.zul?login_error=1"></beans:property>
            </beans:bean>
        </beans:property>
    </beans:bean>
</beans:beans>



2、登录过滤器中检查图片验证码。 

SecuriyLoginFilter.java源码:
 

[code]package me.linkwork.lmemo.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import me.linkwork.lmemo.constant.MemoCns;
import me.linkwork.lmemo.exception.CaptchaException;
import me.linkwork.lmemo.util.LwToolkit;

/**
 * 登录过滤器
 * @author Linkwork, 276247076@qq.com
 * @since 2016年2月11日
 */
public class SecuriyLoginFilter extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(
            HttpServletRequest request,
            HttpServletResponse response)
                    throws AuthenticationException {
        String inputCode = request.getParameter("code");
        String code = (String) request.getSession().getAttribute(MemoCns.LOGIN_CAPTCHA);
        if(LwToolkit.isBlank(code)
                || (! code.equalsIgnoreCase(inputCode))) {
            throw new CaptchaException("图片验证码不正确!");
        }
        return super.attemptAuthentication(request, response);
    }

}



3、登录用户信息加载处理。 

MemoUserDetailsServiceImpl.java源码:
 

[code]package me.linkwork.lmemo.database.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import me.linkwork.lmemo.database.entity.MemoUserEntity;
import me.linkwork.lmemo.enums.RoleEnum;
import me.linkwork.lmemo.wrap.MemoUserWrap;

/**
 * 登录用户加载处理
 * @author Linkwork, 276247076@qq.com
 * @since 2016年1月30日
 */
@Service
public class MemoUserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private MemoUserServiceI userService;

    @Override
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        MemoUserEntity userEntity = this.userService.query(name);
        if (userEntity != null) {
            MemoUserWrap userWrap = new MemoUserWrap(userEntity, RoleEnum.USER.getValue());
            return userWrap;
        }
        throw new UsernameNotFoundException("user name not found!");
    }

}



4、登录用户信息包装。 

MemoUserWrap.java源码:
 

[code]package me.linkwork.lmemo.wrap;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;

import me.linkwork.lmemo.database.entity.MemoUserEntity;

/**
 * 登录用户信息包装
 * @author Linkwork, 276247076@qq.com
 * @since 2016年1月31日
 */
public class MemoUserWrap extends User {

    private static final long serialVersionUID = -8221951436648025707L;

    /**
     * 用户信息
     */
    private MemoUserEntity userEntity;

    /**
     * 获取权限集
     * @param authority
     * @return
     */
    private static Collection<? extends GrantedAuthority> getAuthorityCollection(String authority) {
        ArrayList<GrantedAuthority> athLst = new ArrayList<GrantedAuthority>(1);
        athLst.add(new SimpleGrantedAuthority(authority));
        return athLst;
    }

    /**
     * 
     * @param username
     * @param password
     * @param authorities
     */
    public MemoUserWrap(
            String username,
            String password,
            Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
    }

    /**
     * 
     * @param userEntity
     * @param authority
     */
    public MemoUserWrap(MemoUserEntity userEntity, String authority) {
        super(userEntity.getMus_name(), userEntity.getMus_pss(), true, true, true, true, getAuthorityCollection(authority));
        this.userEntity = userEntity;
    }

    public MemoUserEntity getUserEntity() {
        return userEntity;
    }

    public void setUserEntity(MemoUserEntity userEntity) {
        this.userEntity = userEntity;
    }

}

本文转载自:

共有 人打赏支持
抢地主
粉丝 5
博文 131
码字总数 24524
作品 0
朝阳
私信 提问
在 Web 项目中应用 Apache Shiro

用户权限模型 在揭开 Shiro 面纱之前,我们需要认知用户权限模型。本文所提到用户权限模型,指的是用来表达用户信息及用户权限信息的数据模型。即能证明“你是谁?”、“你能访问多少受保护资...

BenettX
2013/08/28
0
0
在 Web 项目中应用 Apache Shiro

用户权限模型 在揭开 Shiro 面纱之前,我们需要认知用户权限模型。本文所提到用户权限模型,指的是用来表达用户信息及用户权限信息的数据模型。即能证明“你是谁?”、“你能访问多少受保护资...

heroShane
2014/02/09
0
3
SpringBoot集成Spring Security(4)——自定义表单登录

通过前面三篇文章,应该大致了解了Spring Security的流程。你应该发现了,真正的登录请求是由Spring Security帮我们处理的,那么我们如何实现自定义表单登录呢,比如添加一个验证码… 源码地...

yuanlaijike
05/09
0
0
Spring Security之短信登录

实现短信验证码登录 前面实现了 用户名+密码 的登录方式,现在实现一下短信验证码登录. 开发短信验证码接口 短信验证码和图形验证码类似,用户从手机短信得到验证码和从图片得到验证码类似. 校...

yysue
10/23
0
0
在 Web 项目中应用 Apache Shiro 开源权限框架

Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明你是谁? Web 应用程序一般做法...

IBMdW
2013/02/05
19.1K
38

没有更多内容

加载失败,请刷新页面

加载更多

工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
27分钟前
4
0
day146-2018-11-13-英语流利阅读-待学习

5 岁“牛娃”简历给 985 精英一个暴击 Lala 2018-11-13 1.今日导读 “不要让孩子输在起跑线上”,似乎已成为了当下最流行的名句,每个身为家长或还未成为家长的人都不得不思考这句话的分量。...

飞鱼说编程
39分钟前
4
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
5
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部