文档章节

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

抢地主
 抢地主
发布于 2017/05/23 10:04
字数 703
阅读 81
收藏 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 开源权限框架

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

IBMdW
2013/02/05
20.7K
38
在 Web 项目中应用 Apache Shiro

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

heroShane
2014/02/09
0
3
Spring+Shiro案例分析

在 Web 项目中应用 Apache Shiro Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证...

程序界小强
01/08
0
0
Spring Security之短信登录

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

yysue
2018/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
27分钟前
0
0
OSChina 周日乱弹 —— 没时间 没头发 但有钱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @开源中国总经办主任 :分享齐一的单曲《这个年纪》 《这个年纪》- 齐一 手机党少年们想听歌,请使劲儿戳(这里) @肿肿卷 :我真的可以睡一天...

小小编辑
今天
30
4
Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
今天
3
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
3
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部