- springsecurity框架已经被springboot进行了集成,使用时直接导入启动器就可以了
springSecurity 是一个安全框架,利用ioc/di和aop,为系统提供了声明式安全访问控制,程序对用户都要进行认证和授权,
org.springframework.boot
spring-boot-starter-security - 导入spring-boot-starter-security启动器就可以了,
启动项目后就会发现不管是什么请求都是要出现一个登录页面 - 密码是:控制台有
- 当我们什么都不用配置时账户和密码是有spring security定义生成的,实际上账户和密码是从数据库中查询出来的,所以我们要通过自定义认证逻辑控制,需要实现UserDetailsService接口,这个接口中有一个方法loadUserByUsername() 该方法返回一个userDetails 这个也是一个接口,这个userDetails接口中方法是
getAuthorities();返回所有权限
getUsrename();获取用户名
isAccountNonExpired()是否账号过期
isAccountNonLocked()是否账号锁定
isCredentialsNonExpired()密码是否过期
isEnabled()是否可用
这个接口的实现类是User类 这个类的构造方法有两个,参数有username:用户名 password 密码 authorities权限,不能为null
用户名是客户端传过来的,密码是从数据库中查询出来的,会将传过来的密码和查询出来的密码进行验证,
异常UsernameNotFoundException用户名没有发现异常,系统没有查询对应的用户名,
- PasswordEncoder密码解析器 是一个接口
spring security 容器中必须要有PasswordEnabler实例,所以在自定义登录逻辑时要求必须给容器注入给PasswordEnabler的bean对象
实际上就是对密码进行加密,
方法encode()是对密码参数进行加密,matches(rewpassword,encodepassword)匹配 原始字符串和加密后的字符串比较是否一样返回boolean类型,
实现类用BCryptPasswordEncoder 是官方推荐使用的密码解析器 - 自定义登录逻辑
当想要自定义登录逻辑时,必须要用到UserDetailsService接口和Passwordencoder验证器,spring Security框架进行自定义登录逻辑时,必须要有password encoder实例,所以不能直接new - 自定义登录页面
spring security 中可以设置自定义登录页面,需要修改配置类,
修改配置类,主要是设置那个页面是登录页面,配置类需要继承WebSecurityConfigurerAdapte,重写configure方法
successForwardUrl()设置登录成功后跳转的地址,
loginPage()登录页面
loginProcessingUrl登录页面表单提交地址,
antMatchers()匹配内容,
permitAll();允许 - 在这个配置类中webSecurityconfigurerAdapter类中的configure方法中设置自定义登录页面
在这个类中做表单认证,url拦截,关闭csrf防护,失败跳转,
在配置方法中表单认证部分添加failureForwrodUrl(url)方法是表示登录失败后跳转的url页面,
在设置url拦截时http.authorizeRequests();中将不会拦截失败页面的跳转antMatchers().permitAll() - 设置请求账户和密码的参数名
• 当进行登录时会执行UsernamePasswordAuthenticationFilter过滤器,
usernamePasrameter:账户参数名
passwordParameter:密码参数名
postOnly=true 默认情况下只允许post请求。
在修改表单认证时可以设置usernameParameter(“myusername”)自定义用户名
passwordParameter(“mypassword”);
使用successForwardUrl()表示登录成功后转发请求地址。
- 访问控制url 认证中的配置主要在http.formLogin()中设置, 在配置类中http.authorizeRequests()主要是对url进行控制,访问控制,其中方法有
• anyRequest()表示拦截所有请求,都要进行认证,
anyRequest().authenticated()验证
antMatcher()对某个请求进行处理,
antMatcher().permitAll();//?是匹配一个字符 *0个或是多个 ** 0个或是多个目录
访问控制方法
spring security框架匹配到url后调用permitAll()表示不需要认证,随意访问,
authenticated()表示匹配到的url都需要被认证才能访问
denyAll()表示匹配的url都不允许被访问,
rememberMe()被remember me 用户允许访问,