文档章节

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

抢地主
 抢地主
发布于 2017/05/23 10:04
字数 703
阅读 63
收藏 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
在 Web 项目中应用 Apache Shiro 开源权限框架

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

IBMdW
2013/02/05
19.1K
38
Apache Shiro 开源权限框架

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

村长大神
2016/10/20
37
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka技术资料总结(不断更新中)

1、Kafka实践:到底该不该把不同类型的消息放在同一个主题中 2、Kafka剖析系列: Kafka剖析(一):Kafka背景及架构介绍 Kafka设计解析(二):Kafka High Availability (上)...

九州暮云
34分钟前
1
0
面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
今天
4
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
今天
4
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
4
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部