一.配置类中常用的对象和方法
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>
来源:https://www.cnblogs.com/XiaoMaGuai/p/16316376.html
本站部分图文来源于网络,如有侵权请联系删除。