文档章节

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

抢地主
 抢地主
发布于 2017/05/23 10:04
字数 703
阅读 59
收藏 0
点赞 0
评论 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
SpringMVC中使用Kaptcha验证码组件生成比较安全的验证码

一 简介 Kaptcha是一个基于SimpleCaptcha的验证码开源项目,在我们的项目中使用Kaptcha组件可以快速生成比较安全的验证码。同时Kaptcha还提供了许多的参数可以让我们自定义生成的验证码样式 ...

pangfc
06/26
0
0
Spring Sceurity的开发1

在开发实际应用项目当中,肯定存在用户登录和授权的过程,之前我们使用自己开发的权限框架或者 Shiro 来做这块内容的扩展和延伸,今天使用 Spring 框架自身的权限框架来集成下,也就是 Spri...

breezedancer
05/24
0
0
结合SSM框架讲解Shiro案例--Shiro Demo

本教程结合SSM(SpringMVC + Mybatis)框架讲解Shiro(Shiro是 Java 的一个安全框架。我们经常看到它被拿来和 Spring 的 Security 来对比。),讲解的内容有自定义Shiro拦截器,Shiro Freem...

8446666
2016/06/29
20.9K
8
spring整合kaptcha验证码

kaptcha简介: kaptcha 是一个很有用的验证码生成工具,由于它有许多可配置项,所以用它可以简单快捷的生成各式各样的验证码。 开发工具及使用的核心技术: 1、eclipse 2、mybatis 3、spring ...

贪挽懒月
05/09
0
0
spring security与cas client集成(无http标签方式)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.spri......

Catelyn
2014/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 你被我从 osc 老婆们名单中踢出了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小鱼丁:分享五月天的单曲《后来的我们 (电影《后来的我们》片名曲)》: 《后来的我们 (电影《后来的我们》片名曲)》- 五月天 手机党少年们想...

小小编辑
11分钟前
3
1
Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
30分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
今天
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部