spring-boot-security

28.Security 安全

默认会加上安全验证,要加上方法级认证,请加上@EnableGlobalMethodSecurity注解 当你的日志级别为info时,默认密码会打印到日志上 SpringBootWebSecurityConfiguration主要用于web项目验证; AuthenticationMangerConfiguration主要用于非web项目;git

28.1.1.认证服务器

建立认证服务器,须要使用@EnableAuthorizationServer注解还须要提供security.oauth2.client.client-id和security.oauth2.client.client-secret属性;客户端将被注册到缓存仓库中;github

这么作意味着你有能力使用客户端凭证来建立访问令牌web

基本的客户端终点凭证都是客户端id和客户端密码;用户凭证和正常的spring security相同;spring

你可使用AuthorizationServerConfigurer类的@Bean注解来实现自配置;api

28.1.2资源服务器

要使用访问令牌(access Token)你须要一个资源访问器(可能和认证服务器相同).搭建很容易,只须要添加 @EnableResourceServer注解和提供令牌解码的一些配置便可;若是你的应用也是一个认证服务器且能够解密token,那么你不须要作任何其余事情;假如你的应用是一个单独的服务,你须要作一些额外的配置,选择以下:缓存

security.oauth2.resource.user-info-uri to use the /me resource (e.g. uaa.run.pivotal.io/userinfo on PWS)
   security.oauth2.resource.token-info-uri to use the token decoding endpoint (e.g. uaa.run.pivotal.io/check_token on PWS).

user-info-uri和token-info-uri同时定义,你须要指定优先级;prefer-token-info=ture是默认优先级; 另外,这些令牌若是是JWT,你能够配置security.oauth2.resource.jwt.key-value在本地解码他们; 验证私钥的值多是对应的私钥,也多是PEM编码的RSA公钥;若是你没有的该密钥且他是公开的,你能够提供一个 url下载他们,属性为:security.oauth2.resource.jwt.key-uri; 提示:假如你在认证服务器程序启动时使用了security.oauth2.resource.jwt.key-uri;若是他找不到key,他会提示你如何修复这个警告;安全

user信息的令牌类型 谷歌,一些其余的第三方验证提供商,对于令牌类型名称(他们会在请求头中发送到用户信息终端)很是严格. 默认的令牌类型是"Bearer",它兼容大部分厂商;你能够经过修改"security.oauth2.resource.token-type"来修改令牌类型服务器

28.3定制User info RestTemplate

若是你有一个user-info-uri属性,那这个资源服务器特性会使用"OAuth2RestTemplate"来关联抓取相关用户信息. 他提供一个完整的bean,其id为"userInfoRestTemplate",不过你不必知道如何用它;默认配置能够解决大部分问题,不过有时候你须要增长额外的拦截器,或者替换请求认证器.你能够经过一个建立一个UserInfoRestTemplateCunstomizer类的bean来;他有个单独的方法,在bean建立未初始化时调用;这个rest Template只有在输出认证关联信息时才被调用; 在yaml文件中设置RSA key,用竖线("|")来分割 其格式以下:并发

security:
  oauth2:
      resource:
          jwt:
              keyValue: |
                  -----BEGIN PUBLIC KEY-----
                  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC...
                  -----END PUBLIC KEY-----

28.3.1 客户端

你能够经过@EnableOAuth2Client和添加一个OAuth2RestTemplate的@Autowire注解来实现;它能够security.oauth2.client.*做为凭证;和在服务端配置的相同,但它须要知道认证服务器的认证和令牌的urls; application.yamlapp

security:
    oauth2:
        client:
            clientId: bd1c0a783ccdd1c9b9e4
            clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
            accessTokenUri: https://github.com/login/oauth/access_token
            userAuthorizationUri: https://github.com/login/oauth/authorize
            clientAuthenticationScheme: form

在这种配置的应用中,当咱们要使用OAuth2RestTemplate时,它会自动重定向至Github网站进行认证; 若是你早已在github网站上注册了,那你就甚至不会发现它已经被受权了.这些具体的凭证只有当你的项目在8080端口上工做时才起做用(你能够灵活的选择将你的本身的客户端app注册在Github或其余供应商);

你能够设置令牌的做用域,经过yaml文件里的security.oauth2.client.scope属性.一般scope是空的,它取决于Authorization Server(即取决于客户端注册时的设置);

注:你还能够设置security.oauth2.client.client-authentication-scheme属性;该属性默认是header,但一些厂商不喜欢header,因此你能够改成form;实际上,security.aouth2.client.*属性取决于你本身配置的AuthorizationCodeResourceDetail的实例

提示:在非web应用中,你仍可使用@Autowire和@OAuth2RestOperations注解;它仍会注入securtiy.oauth2.client.*配置.在这种状况(你要使用它),它将是一个你炫耀请求的"客户端凭证令牌授予";

你不须要使用@EnableOauth2Client或者@EnableOAuth2Sso.要关闭它,只须要将security.oauth2.client.client-id属性从配置文件中清除便可;

single Sign On (单点登陆)

一个OAuth2客户端能够用于从供应厂商那里(这些特性是可得到的)抓取用户明细并将这些信息封装为spring安全的权限令牌.资源服务器经过user-info-uri属性(以单点登陆协议(Single Sign On(SSO)))支持该功能,spring boot经过提供@EnableOAuth2Sso注解使其变得特别容易.因为上面提到的Github客户端已经加了相关的注解和声明,它就可使用"/user/"终点来保护他的资源和受权;

application.yml

security:
      oauth2:
     ...
      resource:
          userInfoUri:https://api.github.com/user
          preferTokenInfo:false;

因为全部的路径都被保护,全部没有home页面可供展现给未受权的用户;访问"/login"路径登录或者经过"security.oauth2.sso.login-path"来定制登录路径; 咱们也能够定制本身的要保护的访问规则或路径,这样咱们就能够添加欢迎页面了,前提:你经过在WebSecurityConfigurerAdapter类上添加@EnableOAuth2Sso,这个注解可使该类获得装饰和加强,而且可使默认的"/login"路径起做用;例如,咱们能够简化未收取路径为"/",这样咱们还能够保持其余设置为默认;

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void init(WebSecurity web) {
        web.ignore("/");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().anyRequest().authenticated();
    }

}

28.4 Actuator Security 执行安全

若是执行器在应用中,你会发现: 1.管理端点都是安全的,即便应用端点是不安全的 2.安全事件均可以收集到审计事件中并发布到审计服务里; 3.默认用户同时拥有user角色和admin角色 审计安全特性能够能够经过其余属性来改变(management.securtiy.*);

使用WebSecurityConfigurerAdapter进行重写时:假如不想重写access规则,则使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER);要重写access规则,则使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)注解;

相关文章
相关标签/搜索