spring security oauth2的学习过程(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18416057/article/details/86999426

      今天来学习一下如何做一个登录框,验证用户账号密码,验证成功之后如何从授权服务器里获取token,方便之后的操作。

      首先我们要做一个简单的登录框,前面我们既然用到了spring security  oauth2的东西,那必然会用到spring security,它是一个权限控制的东西,东西很多,有兴趣的同志大家自己可以去网上学习一下,同类的东西还有shiro,还有这里有一点需要提醒的东西,spring security  oauth2 其实就是将原先单独的auth2.0整合到spring security中,本身它们就是2个不一样的东西,整合之后可能有些类是一样的,但记住用途不能混为一谈 。它里面就有一个简单的登录功能 

    首先我们新建如下类

@Configuration
@EnableWebSecurity

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception {

        //formLogin() 类型与spring security里xml的form-login元素,目的就是打开一个formlogin
        http.authorizeRequests().antMatchers("/**").access("hasRole('USER')")
        .and().formLogin();



    }



}

启动再次访问的时候出现如下页面

账号:user 密码会在启动日志中显示

登录之后能访问相应的资源了

刚才我们是是直接采用spring security中默认用户的账号和密码,那怎么自定义呢?其实我们前几次在弄授权服务器的时候已经解决了这个问题了,直接将原有的JDBCUserDetailService替换掉就行了,

@Configuration
public class JdbcUserDetailService implements UserDetailsService {


    @Override
    public UserDetails loadUserByUsername(String userName){
        //我这边偷懒没有用dao去查数据库
        //UserDetails ud = super.loadUserByUsername(username);
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));

//自定义查询用户的方式
   //     return  new //User("zfh12","$2a$10$k2/8rCh.1FGCoNt1LggQhePMPufVc.LolyZtqGSoGbPlDxLiNFKJq",authorities);
    }

}

然后现在又有一个问题了,现在看是简单的对接spring security的login登录实现了,但在企业中,项目很多,而且很多也已经采用了微服务的框架,不可能每个项目都像上面一样写一套吧,如果不嫌烦那你们自己去做好了。其实最好的方式就是利用好微服务,将这一块东西集中到一个项目中,方便统一管理。

扫描二维码关注公众号,回复: 5521458 查看本文章

一般企业的做法有2种:

1,全部项目的登录地址全部指向一个地址(也就是单独的一个专门干登录的,以前现在微服务也是这样设计的,主不过加了spring security,无非就是将验证的地址指向一个就行)

第一个方案有一个我自己知道的问题就是所有系统的登录页面都是一个样子的,有些就需要每个系统有自己风格的页面,不需要全部不一样,但登录页面的有些部分希望能体现各自系统的,于是第二种方案就是出现了

2登录页面还是在各自系统,只是页面中嵌了一个ifame的登录框,页面的其它部分可以按照自己系统的特色,但登录框是一样的,地址指向的是同一个地址

2种方案都有见到过,根据各自所需吧,第二种就是比第一种实现上麻烦一点

先说说第一种吧,第一种其实很简单。本来我们各自系统中Springsecurity都有简单的loginform,现在只需要将页面直接变成我们之前弄的授权服务器那里的地址就行了

那怎么将地址指向我们授权服务器的login呢?其实spring security已经提供了配置,只要遵循它的配置就可以将登陆的地址改掉。

只需要将如下代码

@Configuration
@EnableWebSecurity

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception {

        //formLogin() 类型与spring security里xml的form-login元素,目的就是打开一个formlogin
        http.authorizeRequests().antMatchers("/**").access("hasRole('USER')")
        .and().formLogin();



    }



}

改成下面的

@Configuration
@EnableWebSecurity

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception {

        //formLogin() 类型与spring security里xml的form-login元素,目的就是打开一个formlogin
        http.authorizeRequests().antMatchers("/**").access("hasRole('USER')")
        .and().formLogin()
             // 自定义登陆页面的地址,默认login
                .loginPage(loginUrl);
    }
}

代码中的loginUrl就是你要指向的地址,关于spring security loginform这一块的配置属性如下:

form-login是spring security命名空间配置登录相关信息的标签,它包含如下属性: 
1. login-page 自定义登录页url,默认为/login 
2. login-processing-url 登录请求拦截的url,也就是form表单提交时指定的action 
3. default-target-url 默认登录成功后跳转的url 
4. always-use-default-target 是否总是使用默认的登录成功后跳转url 
5. authentication-failure-url 登录失败后跳转的url 
6. username-parameter 用户名的请求字段 默认为userName 
7. password-parameter 密码的请求字段 默认为password 
8. authentication-success-handler-ref 指向一个AuthenticationSuccessHandler用于处理认证成功的请求,不能和default-target-url还有always-use-default-target同时使用 
9. authentication-success-forward-url 用于authentication-failure-handler-ref 
10. authentication-failure-handler-ref 指向一个AuthenticationFailureHandler用于处理失败的认证请求 
11. authentication-failure-forward-url 用于authentication-failure-handler-ref 
12. authentication-details-source-ref 指向一个AuthenticationDetailsSource,在认证过滤器中使用

上面弄好之后,我们再重新启动一下授权服务器,和我们的资源服务器,然后访问资源服务器的endpoint

然后先用资源服务器生产的默认账号去登,结果如下:

然后用我们授权服务器之前配置的账号登,结果如下:

我们看到账号已经校验成功了。

这说明了,资源服务器中校验用户账号(登录)已经换成了我们授权服务器的地址了,以后不管还有多少新的项目都可以直接替换成授权服务器的地址,统一做登录的一系列操作,这样也符合微服务。

        现在校验登录账号的功能已经好了,接下来就是在校验成功之后如何去获取token。

其实也简单的,之前我们已经学会了如何获取token了,我们只需要将登录成功之后多次重定向,获取到token之后再返回原先一开始的请求地址就OK了

猜你喜欢

转载自blog.csdn.net/qq_18416057/article/details/86999426