SpringBoot~Spring Security入門(mén)

Spring Security簡(jiǎn)介

  Spring Security 是專門(mén)針對(duì)基于Spring的項(xiàng)目安全框架,充分利用了依賴注入和AOP來(lái)實(shí)現(xiàn)安全的功能母赵,安全框架主要用的是認(rèn)證(Authentication)和授權(quán)(Authorization)小槐。

SpringBoot 對(duì)其的支持

關(guān)于Spring Security 的自動(dòng)配置在SpringBoot 中在org.springframework.boot.autoconfigure.security包中 

關(guān)于在SpringBoot中配置Spring Security 包含下圖這樣

Spring Security在SpringBoot中配置

當(dāng)我們需要使用自己的擴(kuò)展配置時(shí)需要自己的類實(shí)現(xiàn)WebSecurityConfigurerAdapter類即可

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    UserDetailsService customUserService(){
        return new CustomUserService();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserService());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .failureUrl("/login?error")
                .permitAll()
                .and()
                .logout()
                .permitAll();

    }

}

實(shí)戰(zhàn)

  1. 首先添加pom文件 。這里使用的mysql 數(shù)據(jù)庫(kù)
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
  1. 在application.properties中配置好數(shù)據(jù)庫(kù)鏈接
spring.jpa.database=mysql
spring.datasource.url=jdbc:MySQL://localhost:3306/com_study
spring.datasource.username = root
spring.datasource.password=111111
spring.datasource.driverClassName = com.mysql.jdbc.Driver

spring.jackson.srialization.indent_output=true


spring.jpa.hibernate.ddl-auto=update

spring.jpa.show-sql=true
debug=true

logging.level.org.springframework.security= INFO
spring.thymeleaf.cache=false
  1. 定義實(shí)現(xiàn)我們的實(shí)體bean
@Entity
public class SysUser implements UserDetails{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    private String userName;

    private String password;

    @ManyToMany(cascade = {CascadeType.REFRESH},fetch = FetchType.EAGER)
    private List<SysRole> roles;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> auths=new ArrayList<GrantedAuthority>();
        List<SysRole> roles=this.getRoles();

        for(SysRole role:roles){
            auths.add(new SimpleGrantedAuthority(role.getName()));
        }

        return auths;
    }

    @Override
    public String getPassword() {
        return null;
    }

    @Override
    public String getUsername() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }

    public List<SysRole> getRoles() {
        return roles;
    }

    public void setRoles(List<SysRole> roles) {
        this.roles = roles;
    }
}

@Entity
public class SysRole {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  1. 添加配置文件web和Security配置
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
    }
}

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    UserDetailsService customUserService(){
        return new CustomUserService();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserService());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .failureUrl("/login?error")
                .permitAll()
                .and()
                .logout()
                .permitAll();

    }

}

  1. 實(shí)現(xiàn)service 并且dao層實(shí)現(xiàn)jpa
public interface SysUserRepository extends JpaRepository<SysUser,Long> {

        SysUser findByUserName(String userName);

}

public class CustomUserService implements UserDetailsService {

    @Autowired
    private SysUserRepository sysUserRepository;


    @Override
    public UserDetails loadUserByUsername(String username)  {

        SysUser user=sysUserRepository.findByUserName(username);
        if(user==null){
            throw new  UsernameNotFoundException("用戶名不存在");
        }

        return user;
    }


}

  1. 添加我們的頁(yè)面的登錄頁(yè)面login.html

總結(jié)

我們?cè)趯?shí)現(xiàn)安全驗(yàn)證內(nèi)容的時(shí)候,首先需要實(shí)現(xiàn)我們需要的WebSecurityConfigurerAdapter 然后我們重寫(xiě)我們config 方法烟央,在代碼Security配置中我們?cè)O(shè)置權(quán)限訪問(wèn)anyRequest 任何訪問(wèn)頁(yè)面的路徑都需要先登錄驗(yàn)證后才可以洼滚。如果不想每個(gè)頁(yè)面都得登錄才可以訪問(wèn),我們可以自己定制匹配路徑可以在http.authorizeRequests()中使用antMatcher("/user/index")或者regexMatchers("/user/index"),更多配置方式可以看Spring的頁(yè)面皮璧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舟扎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悴务,更是在濱河造成了極大的恐慌睹限,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異羡疗,居然都是意外死亡删窒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)顺囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肌索,“玉大人,你說(shuō)我怎么就攤上這事特碳〕涎牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵午乓,是天一觀的道長(zhǎng)站宗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)益愈,這世上最難降的妖魔是什么梢灭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蒸其,結(jié)果婚禮上敏释,老公的妹妹穿的比我還像新娘。我一直安慰自己摸袁,他們只是感情好钥顽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著靠汁,像睡著了一般蜂大。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝶怔,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天奶浦,我揣著相機(jī)與錄音,去河邊找鬼踢星。 笑死澳叉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩狱。 我是一名探鬼主播耳高,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼所踊!你這毒婦竟也來(lái)了泌枪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秕岛,失蹤者是張志新(化名)和其女友劉穎碌燕,沒(méi)想到半個(gè)月后误证,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡修壕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年愈捅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈鸠。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓝谨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出青团,到底是詐尸還是另有隱情譬巫,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布督笆,位于F島的核電站芦昔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娃肿。R本人自食惡果不足惜咕缎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望料扰。 院中可真熱鬧凭豪,春花似錦、人聲如沸记罚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桐智。三九已至,卻和暖如春烟馅,著一層夾襖步出監(jiān)牢的瞬間说庭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工郑趁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刊驴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓寡润,卻偏偏與公主長(zhǎng)得像捆憎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梭纹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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