武汉网站制作/成都最新数据消息
文章目录
- 1.认证与授权
- 2.基于数据库认证
- 3.自定义登录页面
- 4.授权方式
- 4.1 基于角色授权
- 4.2 基于权限授权
1.认证与授权
认证与授权是Spring Secuirty最重要的核心功能。
认证: 代表的是用户和密码是否正确, 是建立一个他声明的主体的过程. 系统认为用户是否能登录。
授权: 系统判断用户是否有权限去做某些事情。
2.基于数据库认证
这里利用的是Mybatis-plus
pom
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
application.properties:
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/demo01?serverTimezone=GMT%2B8&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mapper:
@Repository
public interface UserMapper extends BaseMapper<Users> {
}
javaBean: Users:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users {private Integer id;private String username;private String password;
}
config:
service:
@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {QueryWrapper<Users> wrapper = new QueryWrapper<>();wrapper.eq("username", s);Users users = userMapper.selectOne(wrapper);if (users == null){throw new UsernameNotFoundException("未找到");}// 权限 + ROLE_角色List<GrantedAuthority> list = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_sale");UserDetails userDetails = new User(users.getUsername(), new BCryptPasswordEncoder().encode(users.getPassword()), list);return userDetails;}
}
第一个是利用mybatis-plus查询出数据库的用户名和密码, 然后进行认证。
3.自定义登录页面
WebSecurityConfigurerAdapter#configure()
@Configuration
@MapperScan("com.atguigu.security01.mapper")
public class Config2 extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {// 配置无权限的页面http.exceptionHandling().accessDeniedPage("/uauth.html");http.formLogin().loginPage("/login.html") // 登录页面设置.loginProcessingUrl("/user/login") // 登录成功后访问的controller路径.defaultSuccessUrl("/test/index").permitAll() // 登录成功后跳转的路径.and().authorizeRequests()// 不需要认证.antMatchers("/", "/test/hello", "/user/login").permitAll().anyRequest().authenticated() // 所有路径不用认证.and().csrf().disable();// 关闭csrf 防护}
}
登录页面设置为 login.html
失败页面设置为 uauth.html
这里需要强调一下: name必须为username 和 password
过滤器UsernamePasswordAuthenticationFilter#attemptAuthentication()
localhost:8111/test/index
4.授权方式
还是在配置类的configure方法中定义授权方式
- 基于角色授权
- 基于权限授权
4.1 基于角色授权
hasRole
根据hasRole方法可知, 基于角色的认证, 角色必须为ROLE_角色
比如上面的sale角色, 那么就需要加入ROLE_sale的角色授权
4.2 基于权限授权
hasAuthority, hasAnyAuthority
基于权限的授权, 先配置有这个权限的admin, 然后通过两个方法hasAuthority, hasAnyAuthority在WebSecurityConfigurerAdapter#config()中配置。