一.配置类中常用的对象和方法
1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSecurityManager对象
2.DefaultWebSecurityManager()对象:通过创建的该对象调用setRealm方法关联创建的Realm对象,其中Realm对象时自己定义的一个Realm类
3.setSecurityManager()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置安全管理器,其参数为DefaultWebSecurityManager对象,可以从创建的ShiroFilterFactoryBean方法中传参获取
4.setFilterChainDefinitionMap()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置shiro内置的过滤器,其参数为一个map集合
5.setLoginUrl()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置如果没有登录用户时要跳转的页面的地址
6.setRealm()方法:通过创建的DefaultWebSecurityManager对象调用该方法,设置Realm对象,其参数为Realm对象
7.代码样例:
package com.xiaoma.config; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap; import java.util.Map; /** * Author:xiaoma * FileName:MyShiroConfig * Data:2022/5/25 21:34 */ //这里要做三件事,创建ShiroFilterFactoryBean,创建DefaultWebSecurityManager,创建realm对象,这三件事要倒着做 @Configuration public class MyShiroConfig { //创建ShiroFilterFactoryBean,关联DefaultWebSecurityManager @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("DWSM") DefaultWebSecurityManager defaultWebSecurityManager){ ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); //设置安全管理器 filterFactoryBean.setSecurityManager(defaultWebSecurityManager); /* * 添加shiro内置的过滤器 * anon:无需认证就可以访问 * authc:必须认证才可以访问 * user:必须拥有记住我功能才能使用 * perms:拥有对某个资源的权限才可以访问 * role:拥有某个角色权限才可以访问 * */ Map<String, String> filterMap = new LinkedHashMap<>(); filterMap.put("/user/add","authc"); filterMap.put("/user/update","authc"); //他需要一个map集合 filterFactoryBean.setFilterChainDefinitionMap(filterMap); //如果没有登录用户,要跳转到登录页 filterFactoryBean.setLoginUrl("/toLogin"); return filterFactoryBean; } //创建DefaultWebSecurityManager,通过@Qualifier注解关联realm对象 /* * @Qualifier注解中的参数 * 如果要关联的方法的bean没有name属性,那么就是该方法名,默认也是这种方式 * 如果bean注解有name属性,那么@Qualifier注解中的参数就是bean注解的name属性 * */ @Bean(name = "DWSM") public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } //创建realm对象,这个对象要自定义,继承AuthorizingRealm,并重写其中的方法 @Bean public UserRealm userRealm(){ return new UserRealm(); } }
二..Realm类中常用的对象和方法
1.UsernamePasswordToken()对象:用来设置用户名和密码的Token,设置是否记住我等,其常用方法有(除了构造器外)

2.SimpleAuthenticationInfo()对象:可以用来让shiro帮我们验证一些东西的,以验证密码为例,代码如下
2.1Realm类中的代码
package com.xiaoma.config; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; /** * Author:xiaoma * FileName:UserRealm * Data:2022/5/25 21:34 */ public class UserRealm extends AuthorizingRealm { //授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行了授权"); return null; } //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行了认证"); //用户名密码从数据库中取出就可以了 String name="root"; String pwd="123"; UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken; //用户名认证 if (!userToken.getUsername().equals(name)) { //抛出异常UnknownAccountException return null; } //密码认证shiro帮我们做 return new SimpleAuthenticationInfo("",pwd,""); } }
2.2controller接口的代码
@RequestMapping("/login")
public String userLogin(String username,String password,Model model){
//获取当前用户
Subject subject = SecurityUtils.getSubject();
//封装用户登录的数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//执行登录方法并捕获相关异常
try {
//登录成功返回首页
subject.login(token);
return "index";
}catch (UnknownAccountException e){
model.addAttribute("msg","用户名错误");
return "login";
}catch (IncorrectCredentialsException e){
model.addAttribute("msg","密码错误");
return "login";
}
}
2.3登陆界面的代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <h1>登录</h1> <p th:text="${msg}" style="color: red"></p> <form action="/login"> <p>用户名:<input name="username" type="text"></p> <p>密 码:<input name="password" type="password"></p> <p><input type="submit"></p> </form> </body> </html>
浙公网安备 33010602011771号