1.编写配置类config
1.1创建Userrealm-----里面是认证和授权的代码---继承里面的两个方法
//自定义的UserRealm 继承AuthorizingRealm //继承AuthorizingRealm类实现里面的授权认证 方法 public class UserRealm extends AuthorizingRealm { //把service层添加进来 @Autowired UserService userService; //一个查询用户名是否存在的方法 //授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权"); //把权限给用户SimpleAuthorizationInfo SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); //info.addStringPermission("user:add");//给这些用户授权 //info.addStringPermission("user:update"); //拿到当前用户的对象 Subject subject= SecurityUtils.getSubject(); User currUntUser=(User) subject.getPrincipal();//得到user对象 //设置当前用户的权限 //相当于info.addStringPermission("user:add");//给这些用户授权 info.addStringPermission(currUntUser.getPrems()); //返回一个info对象 return info; } //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行认证"); //获取用户输入的信息 UsernamePasswordToken userToken=(UsernamePasswordToken) authenticationToken; //查询出来的用户名保存到实体类 User user= userService.queryUserService(userToken.getUsername()); //判断用户名 if(user==null){//等于null表示没有这个人 return null;//表示输入的姓名和数据库不一样就抛出异常---UnknownAccountException } System.out.println("....................."+user.getPassword()); //认证密码 Shiro做~ 第一次参数当前用户的认证,第2个参数是密码,第3个参数是认证名 return new SimpleAuthenticationInfo(user,user.getPassword(),""); }
2.创建ShiroConfig配置类----里面把Userrealm类实现
@Configuration //表示这是一个配置类 public class ShiroConfig { //ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager getDefaultWebSecurityManager){ ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean(); //设置安全管理器 bean.setSecurityManager(getDefaultWebSecurityManager); //添加shiro内置过滤器 /** * anon:无需认证就可以用 * authc:必须认证才可以访问 * user:必须拥有记住我功能才可以使用 * perms:拥有对某个资源的权限 * role:拥有某个角色权限 */ Map<String ,String>filterMap=new LinkedHashMap<String, String>(); //filterMap.put("/*","authc");//表示所有所有/开头的请求都拦截 filterMap.put("/add","authc");//表示add页面认证后才可以访问---这里的路径写的是浏览器访问路径 filterMap.put("/update","authc"); bean.setFilterChainDefinitionMap(filterMap); bean.setLoginUrl("/toLog");//如果没有权限则跳转登录页面 //授权,正常情况下会跳转至授权页面,授权要在拦截器下面 filterMap.put("/add","perms[user:add]");//perms[user:add]表示user用户才可以访问add filterMap.put("/update","perms[user:update]"); //跳转到未授权页面 bean.setUnauthorizedUrl("/noLog"); return bean; } //DefaultWebSecurity @Bean public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){ DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager(); //关联UserRealm defaultWebSecurityManager.setRealm(userRealm); return defaultWebSecurityManager; } //创建realm对象 需要自定义类 装配到spring容器 UserRealm是一个自定义的类 @Bean public UserRealm userRealm(){ return new UserRealm(); } //整合ShiroDialect 用来整合thyamel @Bean public ShiroDialect getShiroDialect(){ return new ShiroDialect(); }
3.控制层接收登录的数据
@RequestMapping("/loging") public String loging(String name, String password, Model model){ //获取当前用户 Subject subject= SecurityUtils.getSubject(); //封装登录的数据 UsernamePasswordToken token=new UsernamePasswordToken(name,password);//放入进去进行加密 try{ subject.login(token);//执行登录方法 return "index"; }catch (UnknownAccountException e) { model.addAttribute("msg","用户名错误"); return "login"; }catch (IncorrectCredentialsException e) { model.addAttribute("msg","密码错误"); return "login"; } } @RequestMapping("/noLog") @ResponseBody public String noLog(){ return "未授权,无法访问"; }
4.整合thymeleaf
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<div shiro:hasPermission="user:add"> //如果权限等于user:add则显示add页面
<a th:href="@{/add}">add</a> </div> <hr> <div shiro:hasPermission="user:update"> <a th:href="@{/update}">update</a> </div>
5.需要的依赖
<!--整合shiro的jar包--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--shiro 整合thymalaf --> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0</version> </dependency>