spring security的使用,深入浅出Spring Security

  spring security的使用,深入浅出Spring Security

  00-1010 1.引入依赖关系2。在哪里设置用户名和密码3。UserDetailsService接口详细说明3.1JdbcDaoImpl实现类3.2InMemoryUserDetailsManager实现类3.3自定义实现类实现用户详细信息服务接口4。如何修改登录页面Spring Se Curity是一个功能强大且高度可定制的认证和访问控制框架,它提供了完美的认证机制和方法级授权功能.是一个优秀的权限管理框架。它的核心是一组过滤器链,不同的函数通过不同的过滤器。今天通过一个简单的案例了解一下Spring Security的基本用法。

  

目录

使用以下代码在项目中引入Spring安全依赖:

 

  依赖关系groupIdorg.springframework.boot/groupId神器Spring-Boot-Starter-Security/Artifact ID/Dependency引入依赖关系后,整个项目受到Spring安全的保护,所有接口只有登录后才能访问。比如我需要访问界面document /doc.html,这样就可以直接跳转到登录页面。如下图:

  这时候你就有10万了。为什么?这一页在哪里?这个用户名和密码是什么?等一下。别担心,听我说。

  00-1010当我们引入Spring Secruity依赖时,项目启动后,控制台中会输出密码。格式为UUID,每次启动密码都不一样,用户名默认为User。

  使用生成的安全密码3360 8 B2 d752 b-8892-4c D3-a7a 9-a 36 e 79 e 1 CAD 8我们可以通过项目的配置文件自定义用户名和密码。代码如下,这样每次项目重启时用户名和密码都是固定的。

  spring : security : user : name : didiplus password : didiplus

  00-1010用户详细信息服务接口只有一个抽象方法,即loaduserbyusername(字符串用户名)。代码如下:

  公共接口user details service { user details loaduserbysusername(String username)抛出UsernameNotFoundException}UserDetailsService接口的返回值是UserDetails接口,这是另一个接口。Spring安全框架在其实现类org . Spring framework . Security . core . User details包下提供了用户类对象。Userdetails源代码如下:

  Spring Security提供了UserDetailsService接口的三个实现类,分别是CachingUserDetailsService、JdbcDaoImpl和InMemoryUserDetailsManager。

  

1.引入依赖

 

  实现类是通过数据库获取用户名和密码,在JdbcUserDetailsManager中定义了很多SQL语句,如下:

  然后我们来看看Jdbc。

  DaoImpl中的loadUsersByUsername方法,如下:

  

 

  

 

  

3.2InMemoryUserDetailsManager实现类

 

  以上代码是判断内存中的HashMap集合中是否有用户数据对应的User对象,如果没有,直接抛出异常,如果有就返回该用户的User对象信息。

  

 

  以上代码是把配置文件中的User相关信息读取到。通过分析源码发现Spring Security框架完成用户登录认证的核心就在与org.springframework.security.core.userdetails包下的UserDetailsService接口。

  

 

  

3.3自定义实现类实现UserDetailsService接口

自定义实现类MyUserDetailsServiceImpl,代码如下:

 

  

@Servicepublic class MyUserDetailsServiceImpl implements UserDetailsService { private static final String USERNAME="admin"; private static final String PASSWORD="admin123"; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if (!USERNAME.equals(username)){ throw new UsernameNotFoundException("用户名不存在"); } UserDetails userDetails = new User(USERNAME,PASSWORD, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common")); return userDetails; }}

重启项目看看,输入定义的用户名和密码,发现登录不了,查看控制台发现报错,提示如下:

 

  

 

  报错的原因是没有使用任何的PasswordEncoder,我们输入的密码没有用加密工具进行加密 。Spring Security其实已经给我们提供了很多的PasswordEncoder。 在org.springframework.security.crypto.password包下有一个PasswordEncoder接口,看看他的实现类

  

 

  把这个PasswordEncoder的任意一个我们需要用来加密密码的实现类的Bean注入到容器里面,就可以直接拿来使用 ,代码如下:

  

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); }}

修改MyUserDetailsServiceImpl类如下:

 

  

@Servicepublic class MyUserDetailsServiceImpl implements UserDetailsService { private static final String USERNAME="admin"; private static final String PASSWORD="admin123"; @Resource BCryptPasswordEncoder cryptPasswordEncoder; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if (!USERNAME.equals(username)){ throw new UsernameNotFoundException("用户名不存在"); } UserDetails userDetails = new User(USERNAME,cryptPasswordEncoder.encode(PASSWORD), AuthorityUtils.commaSeparatedStringToAuthorityList("admin,common")); return userDetails; }}

重启项目再次测试,输入定义的账号和密码。即可访问到接口文档页面。

 

  

 

  

 

  

4.如何修改登录页面

觉得默认的登录页面很丑,我们如何定义自己的登录页面呢?方法也很简单,首先我们先去准备一个登录页面。如下:

 

  

 

  前端代码如下:

  

<form action="/login" class="login-form" > <h1>登录</h1> <div class="txtb"> <input type="text" name="user"> <span data-placeholder="Username"></span> </div> <div class="txtb"> <input type="password" name="pass"> <span data-placeholder="Password"></span> </div> <input type="submit" class="logbtn" value="登录"> <div class="bottom-text"> Dont have account? <a href="#" rel="external nofollow" >Sign up</a> </div></form>

把登录页面文件存放到项目的资源文件夹中static目录下,然后在SecurityConfig重写configure(HttpSecurity http)这个方法,代码如下:

 

  

 @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html") #自定义登录页面 .usernameParameter("user") #对应前端表达name属性 .passwordParameter("pass") #对应前端表达name属性 .loginProcessingUrl("/login") .defaultSuccessUrl("/doc.html") #登录成功后跳转的页面地址 .failureUrl("/login?error=true") .and() .authorizeRequests() .antMatchers("/login.html").permitAll() #放通登录页面 .anyRequest().authenticated(); #其他请求都要认证 http.csrf().disable(); }

重新启动项目,输入定义的用户名和密码,登录成功直接跳转到/doc.html

 

  antMatchers("url").permitAll() 是把某个url放通,不需要登录就能访问。

  到此这篇关于一文详解Spring Security的基本用法的文章就介绍到这了,更多相关Spring Security用法内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: