ch04:限制IP,增加密码修改功能

限制IP

如果有IP访问限制的要求,可以使用SpringEl表达式描述具体IP或者IP子网:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/**").access("hasIpAddress('192.168.109.136') and hasRole('USER')")
                .and().formLogin().loginPage("/login.jsp").permitAll().loginProcessingUrl("/login")
                .and().rememberMe()
                .and().csrf().disable();
    }

这样就限制了用户必须是IP地址为192.168.109.136的用户才能访问,此外如果将IP写为192.168.109.0代表192.168.109.1~192.168.109.255网段可以访问

修改密码

用户有变更密码的需求,变更密码一般需要提供用户原密码等额外信息,此外还需要重复输入密码,以保证用户输入正确等内容,这些已经超出Spring Security的范围,其实大家关心的是如何获得当前已认证的用户信息,并且能够修改它的密码

根据ch02的讲解,Spring Security认证后,当前认证用户被存储到SecurityContextHolder中,这个类提供了静态方法SecurityContextHolder.getContext().getAuthentication()就可以获得当前用户对象,如果需要修改其密码,只需要自定义服务,完成修改功能即可。

  1. 修改WebSecurityConfigurerAdapter,增加用户信息获取服务UserDetailService,该接口是Spring Security用户获取用户信息的接口,扩展该接口可以通过数据库、LDAP等服务获取用户信息,用户信息以UserDetails表示,通过扩展该接口可以提供额外的用户信息。
    /**
     * 定义用户信息获取服务
     * 这里使用内存方式获取用户信息,并添加了一个用户
     *
     * @return
     */
    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user").password("password").roles("USER").build());
        return manager;
    }
  1. 用户修改密码服务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
     * Description:
     * 1.获取已认证用户
     * 2.获取用户管理服务
     * 3.修改密码
     * 4.刷新认证
     *
     * @param password
     * @return
     *
     * @Author: 瓦力
     * @Date: 2017/7/20 14:31
     */
    @RequestMapping(value = "/changePassword", method = RequestMethod.POST)
    public String changePassword(@RequestParam("password") String password) {
        //获得当前用户
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (InMemoryUserDetailsManager.class.isInstance(userDetailsService)) {
            InMemoryUserDetailsManager manager = (InMemoryUserDetailsManager) userDetailsService;
            manager.changePassword(principal.getPassword(), password);//spring security已实现了密码修改功能
        }
        SecurityContextHolder.clearContext();//终止当前认证用户
        return "redirect:/index.jsp";
    }
}public class UserServiceController {
    //获取用户信息服务
    @Autowired
    UserDetailsService userDetailsService;

    /**
     * Description:跳转到用户密码修改界面
     *
     * @return
     *
     * @Author: 瓦力
     * @Date: 2017/7/20 14:59
     */
    @RequestMapping(value = "/changePassword", method = RequestMethod.GET)
    public String changePassword() {
        return "redirect:/changePassword.jsp";
    }
  1. 用户修改密码界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Change Password</h2>
<div>
    <h2>修改密码</h2>
    <form action="/changePassword" method="post">
        <input type="password" name="password" placeholder="Password">
        <input type="submit" value="Change Password">
    </form>
</div>
</body>
</html>
  1. index.jsp增加链接
    <h2>修改密码</h2>
    <a href="/changePassword.jsp">修改密码</a>

通过以上代码,就可以实现密码修改,读者可以试试,其实以上内容与Spring Security的关系并不大,这章主要是为读者介绍Spring Security是如何保存认证用户信息以及如何获得用户信息,这两建立基本概念,为随后的使用数据库方式获取用户信息奠定基础。

InMemoryUserDetailsManager 实现了UserDetailsManager,UserDetailsManager扩展了UserDetailsService,提供了许多内置的用户管理方法:

/**
     * Create a new user with the supplied details.
     */
    void createUser(UserDetails user);

    /**
     * Update the specified user.
     */
    void updateUser(UserDetails user);

    /**
     * Remove the user with the given login name from the system.
     */
    void deleteUser(String username);

    /**
     * Modify the current user's password. This should change the user's password in the
     * persistent user repository (datbase, LDAP etc).
     *
     * @param oldPassword current password (for re-authentication if required)
     * @param newPassword the password to change to
     */
    void changePassword(String oldPassword, String newPassword);

    /**
     * Check if a user with the supplied login name exists in the system.
     */
    boolean userExists(String username);

借助这些方法,我们可以继续完善用户管理功能

代码示例https://github.com/wexgundam/spring.security/tree/master/ch04

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • spring security是spring家族的一个安全框架,入门简单。对比shiro,它自带登录页面,自动完成...
    b47251f96536阅读 385评论 0 1
  • 在Web应用程序中的身份验证 现在让我们来看看你在Web应用程序中使用Spring Security的情况(不启用...
    kuisasa阅读 1,246评论 0 1
  • 什么是Spring Security验证? 提示用户输入用户名和密码进行登录。 该系统 (成功) 验证该用户名的密...
    _白小飞阅读 3,063评论 0 0
  • Spring Security 是一个能够为企业应用系统提供声明式的安全访问控制解决方案的安全框架,减少了为企业系...
    wch853阅读 4,069评论 0 11
  • SpringMVC原理分析 Spring Boot学习 5、Hello World探究 1、POM文件 1、父项目...
    jack_jerry阅读 1,263评论 0 1