简介
- 与Shiro比较出名的2个认证与授权框架。shiro上手更加简单,且只要引入包即可使用,但是功能也更加少。security需要配合spring框架
- 通过安全框架,我们只需要少量的配置即可实现强大的功能
-
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置
默认在控制台输出自动生成的管理员用户,也可以自己配置
spring.security.user.name=tom spring.security.user.password=123
配置类
要定义自己的策略,我们继承
WebSecurityConfigurerAdapter
类即可AuthenticationManagerBuilder
定义认证策略@EnableWebSecurity
开启WebSecurity模式
- 详细的看要继承的类的源码,里面关于代码示例都有
security的配置方法都是采用了链式编程,所以方法的顺序与是否选用都是很自由的
内存认证与授权方式
```java @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override //这里表示这是对于http的配置 protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() //这里是对于请求的权限控制 .antMatchers("/").permitAll() //所有人允许 .antMatchers("/level1/**").hasRole("vip1") //指定角色的允许访问的页面,多个路径使用,分割 .antMatchers("/level2/**").hasRole("vip2") .antMatchers("/level3/**").hasRole("vip3"); //http.formLogin(); 开启登录功能,默认是使用security自带的登录页面,也可以配置自己的 下面配置了登录页的地址,用户名的对应,密码的对应,登录的处理路径,登录成功的跳转路径,登录跳转的页面的权限(这里permitall表示全部允许,不过我们一般在另外写在页面权限里,不在这里写)
http.formLogin().loginPage(“/login”).usernameParameter(“user”).passwordParameter(“pwd”).loginProcessingUrl(“/login”).defaultSuccessUrl(“/“).permitAll();
http.logout().logoutSuccessUrl("/login"); 开启注销功能并跳转页面 // http.logout().logoutSuccessUrl("/login").deleteCookies().invalidateHttpSession(true);注销跳转并删除cookie,并让当前会话失效 http.rememberMe().rememberMeParameter("remember"); 开启记忆功能,是采用cookie实现的,值为前端记住控件的name属性 http.csrf().disable(); //阻止csrf攻击
}
@Override //下面是配置认证,有jdbcAuthentication和inMemoryAuthentication 2种,前者是数据库信息认证,后者是内存信息认证,即把用户信息都保存在代码里而不是数据库里,内存认证配置用户信息如下 protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) //下面配置了用户名,密码,加密方式,用户的角色 //从 security5.x 开始,强制性要求必须使用密码加密器(PasswordEncoder)对原始密码(注册密码)进行加密 .withUser(“cjh”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip2”,”vip3”) .and() .withUser(“root”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip1”,”vip2”,”vip3”) .and() .withUser(“guest”).password(new BCryptPasswordEncoder().encode(“123123”)).roles(“vip1”); } }
<a name="osUDp"></a>
## jdbc认证与授权方式
- 使用jdbc认证,我们只需要写好一个认证服务并实现`UserDetailsService`接口
```java
@EnableWebSecurity
public class SecurityConfig1 extends WebSecurityConfigurerAdapter {
@Autowired //我们自己写的认证服务
private UserDetailsService userDetailsService;
/**
* 授权的
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//首页所有人可以访问,功能页有相应权限才能访问
//链式编程
//请求授权的规则
http.authorizeRequests()
.antMatchers("/","/toLogin").permitAll()
.antMatchers("/level1/**").hasAuthority("1")
.antMatchers("/level2/**").hasAuthority("2")
.antMatchers("/level3/**").hasAuthority("3");
//没有权限,默认到登录页面
http.formLogin()//自定义编写登录页面
.loginPage("/login")//登录页面设置
.loginProcessingUrl("/login")//登录访问路径
.defaultSuccessUrl("/index")//登陆成功后的路径
.usernameParameter("ugh")
.passwordParameter("upwd");
//防止网站攻击
http.csrf().disable();//登出可能存在失败的原因
//注销功能
http.logout().logoutSuccessUrl("/toLogin");
//开启记住我功能
http.rememberMe().rememberMeParameter("remember");
}
/**
* 认证的
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 前一个Detail是配置方法,后一个Detail是自定义认证服务的bean
}
}
@Service("userDetailsService")
public class UserService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String ugh) throws UsernameNotFoundException {
//从数据库中获取用户信息
com.cao.pojo.User user = userMapper.findUserByGh(ugh);
System.out.println(user);
if (user == null) {
//数据库中没有,认证失败
throw new UsernameNotFoundException("该用户不存在");
}
//权限拆分 字符串拆分成数组
String s = user.getUqx();
String[] arr1 = s.split(",");
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(arr1);
//
return new User(user.getUgh(), new BCryptPasswordEncoder().encode(user.getUpsw()), authorities);
}
}
@Data
public class User {
private Integer uid;
private String uname;
private String ugh;
private String upsw; //存密码
private String uzw;
private String uqx; //存角色信息
private String ubmbh;
private String inputp;
private Date itime;
}