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

限制IP

如果有IP訪問限制的要求,可以使用SpringEl表達式描述具體IP或者IP子網(wǎng):

@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網(wǎng)段可以訪問

修改密碼

用戶有變更密碼的需求,變更密碼一般需要提供用戶原密碼等額外信息,此外還需要重復(fù)輸入密碼,以保證用戶輸入正確等內(nèi)容,這些已經(jīng)超出Spring Security的范圍,其實大家關(guān)心的是如何獲得當(dāng)前已認證的用戶信息,并且能夠修改它的密碼

根據(jù)ch02的講解,Spring Security認證后,當(dāng)前認證用戶被存儲到SecurityContextHolder中,這個類提供了靜態(tài)方法SecurityContextHolder.getContext().getAuthentication()就可以獲得當(dāng)前用戶對象,如果需要修改其密碼,只需要自定義服務(wù),完成修改功能即可。

  1. 修改WebSecurityConfigurerAdapter,增加用戶信息獲取服務(wù)UserDetailService,該接口是Spring Security用戶獲取用戶信息的接口,擴展該接口可以通過數(shù)據(jù)庫、LDAP等服務(wù)獲取用戶信息,用戶信息以UserDetails表示,通過擴展該接口可以提供額外的用戶信息。
    /**
     * 定義用戶信息獲取服務(wù)
     * 這里使用內(nèi)存方式獲取用戶信息,并添加了一個用戶
     *
     * @return
     */
    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user").password("password").roles("USER").build());
        return manager;
    }
  1. 用戶修改密碼服務(wù)
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.獲取用戶管理服務(wù)
     * 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) {
        //獲得當(dāng)前用戶
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (InMemoryUserDetailsManager.class.isInstance(userDetailsService)) {
            InMemoryUserDetailsManager manager = (InMemoryUserDetailsManager) userDetailsService;
            manager.changePassword(principal.getPassword(), password);//spring security已實現(xiàn)了密碼修改功能
        }
        SecurityContextHolder.clearContext();//終止當(dāng)前認證用戶
        return "redirect:/index.jsp";
    }
}public class UserServiceController {
    //獲取用戶信息服務(wù)
    @Autowired
    UserDetailsService userDetailsService;

    /**
     * Description:跳轉(zhuǎn)到用戶密碼修改界面
     *
     * @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>

通過以上代碼,就可以實現(xiàn)密碼修改,讀者可以試試,其實以上內(nèi)容與Spring Security的關(guān)系并不大,這章主要是為讀者介紹Spring Security是如何保存認證用戶信息以及如何獲得用戶信息,這兩建立基本概念,為隨后的使用數(shù)據(jù)庫方式獲取用戶信息奠定基礎(chǔ)。

InMemoryUserDetailsManager 實現(xiàn)了UserDetailsManager,UserDetailsManager擴展了UserDetailsService,提供了許多內(nèi)置的用戶管理方法:

/**
     * 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);

借助這些方法,我們可以繼續(xù)完善用戶管理功能

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內(nèi)容

  • spring security是spring家族的一個安全框架,入門簡單。對比shiro,它自帶登錄頁面,自動完成...
    b47251f96536閱讀 419評論 0 1
  • 在Web應(yīng)用程序中的身份驗證 現(xiàn)在讓我們來看看你在Web應(yīng)用程序中使用Spring Security的情況(不啟用...
    kuisasa閱讀 1,266評論 0 1
  • 什么是Spring Security驗證? 提示用戶輸入用戶名和密碼進行登錄。 該系統(tǒng) (成功) 驗證該用戶名的密...
    _白小飛閱讀 3,197評論 0 0
  • Spring Security 是一個能夠為企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,減少了為企業(yè)系...
    wch853閱讀 4,129評論 0 11
  • SpringMVC原理分析 Spring Boot學(xué)習(xí) 5、Hello World探究 1、POM文件 1、父項目...
    jack_jerry閱讀 1,336評論 0 1