文章目录
SpringSecurity
什么是 SpringSesurity ?
在我们的开发中,安全还是有些必要的
用 拦截器 和 过滤器 写代码还是比较麻烦。
SpringSecurity
是SpringBoot
的底层安全默认选型。一般我们需要认证和授权,这也是它的核心功能。我们仅仅需要导入spring-boot-starter-security
模块,进行少量的配置,即可实现强大的安全管理
认证:验证当前访问系统的用户 是不是本系统的用户,并且要具体哪一个用户
授权:经过认证后判断当前用户是否有权限进行某个操作
细节
登录过程
负责我们在登录页面填写的用户和密码登录的请求,入门案例主要由他负责。
使用方法
总结到代码之中。
// 开启 web 安全
@EnableWebSecurity
public class springSecurityConfig extends WebSecurityConfigurerAdapter { // 然后我们继承 web安全配置 适配器
// 链式编程
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(). // authorize 授权
antMatchers("/").permitAll() // ant ==> 蚂蚁 matcher ==> 匹配器 permitAll ==> 允许所有
.antMatchers("/test1/**").hasRole("vip1") // role角色
.antMatchers("/test2/**").hasRole("vip2")
.antMatchers("/test3/**").hasRole("vip3");
// 如果没有用户的情况下,则会跳转到 login 页面 // 登录加工的url
http.formLogin().loginPage("/toLogin").usernameParameter("name").passwordParameter("pwd").loginProcessingUrl("/Login");
// http.formLogin()
// .loginPage("/toLogin") // 设置登录页面URL
// .loginProcessingUrl("/Login") // 设置表单提交的URL 个人感觉:应该是需要认证的模块
// .failureUrl("/login-error") // 登录失败后的重定向URL
// .defaultSuccessUrl("/home", true) // 登录成功后的默认重定向URL
// .and()
// .logout()
// .logoutSuccessUrl("/"); // 注销成功后的重定向URL
// 开启记住我功能
http.rememberMe().rememberMeParameter("jiZhuWo");
http.csrf().disable(); // 关闭脚本跨站攻击
// 开启注销功能
http.logout().logoutSuccessUrl("/index"); // 注销成功后,回到 “/index” 之中。
}
// 认证
@Override // 最新版本需要密码加密
protected void configure(AuthenticationManagerBuilder auth) throws Exception { // Authentication 认证 Manager 管理者
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) // Memory 记忆
.withUser("xj").password(new BCryptPasswordEncoder().encode("abc")).roles("vip1","vip2") // memory ==> 记忆
.and()
.withUser("test").password(new BCryptPasswordEncoder().encode("cba")).roles("vip3");
}
}
我们可以看到,拥有这个功能,不仅提供了权限、安全等,还另外 省去了写登录后台、过滤器等大量繁杂的代码,十分的方便
shiro 的 使用方法
认证
maven 添加 jar 包
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
编写 userReaml 类
public class userRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String name = "root";
String password = "abc";
UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
if(!name.equals(token.getUsername())){
return null;
}
return new SimpleAuthenticationInfo("",password,""); // principal ==> 主要的 credentials ==> 凭据 realm ==> 领域
}
}
shiro config 配置类
注意对于自己的遗漏知识点特此记录:注解:
@Qualifier
@Configuration
public class shiroConfig{
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("manager")DefaultWebSecurityManager def){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(def);
// anon ==> 无需认证就可以访问
// authc ==> 必须认证了才能访问
// user ==> 必须拥有记住我才能使用
// perms ==> 拥有对某个资源的权限才能访问
// role ==> 拥有某个角色权限才能访问
Map<String,String> filerMap = new LinkedHashMap<>();
filerMap.put("/user/*","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filerMap);
shiroFilterFactoryBean.setLoginUrl("/toLogin");
return shiroFilterFactoryBean;
}
@Bean(name = "manager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")userRealm userRealm){
DefaultWebSecurityManager securityManager= new DefaultWebSecurityManager();
securityManager.setRealm(userRealm);
return securityManager;
}
@Bean
public userRealm userRealm(){
return new userRealm();
}
}
controller 类
shiro对接数据库验证全过程
server:
port: 8081
spring:
thymeleaf:
mode: HTML
prefix: classpath:/templates/
suffix: .html
servlet:
content-type: text/html
encoding: UTF-8
cache: false
datasource:
username: root
password: 12345678
url: jdbc:mysql://localhost:3306/xj?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:/mapper/*
权限
关于权限问题 解决方案(数据库)