环境搭建 引入shiro依赖
1 2 3 4 5 6 <dependency > <groupId > org.apache.shiro</groupId > <artifactId > shiro-spring-boot-starter</artifactId > <version > 1.5.3</version > </dependency >
1.创建配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean (DefaultWebSecurityManager defaultWebSecurityManager) {} @Bean public DefaultWebSecurityManager getDefaultWebSecurityManager (Realm realm) {} @Bean public Realm getRealm () {} }
2.配置shiroFilterFactoryBean 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean (DefaultWebSecurityManager defaultWebSecurityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager); HashMap<String, String> map = new HashMap<>(); map.put("/user/login" , "anon" ); map.put("/user/register" , "anon" ); map.put("/user/getImage" , "anon" ); map.put("/register.jsp" , "anon" ); map.put("/**" , "authc" ); shiroFilterFactoryBean.setFilterChainDefinitionMap(map); return shiroFilterFactoryBean; }
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
配置系统公共、受限资源
一般map.put("/**", "authc")
将所有资源拦截,然后主要配置放行不需要受限的资源。
常见过滤器
注意: shiro提供和多个默认的过滤器,我们可以用这些过滤器来配置控制指定url的权限:
配置缩写
对应的过滤器
功能
anon
AnonymousFilter
指定url可以匿名访问
authc
FormAuthenticationFilter
指定url需要form表单登录,默认会从请求中获取username
、password
,rememberMe
等参数并尝试登录,如果登录不了就会跳转到loginUrl配置的路径。我们也可以用这个过滤器做默认的登录逻辑,但是一般都是我们自己在控制器写登录逻辑的,自己写的话出错返回的信息都可以定制嘛。
authcBasic
BasicHttpAuthenticationFilter
指定url需要basic登录
logout
LogoutFilter
登出过滤器,配置指定url就可以实现退出功能,非常方便
noSessionCreation
NoSessionCreationFilter
禁止创建会话
perms
PermissionsAuthorizationFilter
需要指定权限才能访问
port
PortFilter
需要指定端口才能访问
rest
HttpMethodPermissionFilter
将http请求方法转化成相应的动词来构造一个权限字符串,这个感觉意义不大,有兴趣自己看源码的注释
roles
RolesAuthorizationFilter
需要指定角色才能访问
ssl
SslFilter
需要https请求才能访问
user
UserFilter
需要已登录或“记住我”的用户才能访问
3.配置WebSecurityManager 1 2 3 4 5 6 @Bean public DefaultWebSecurityManager getSecurityManager (Realm realm) { DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); defaultWebSecurityManager.setRealm(realm); return defaultWebSecurityManager; }
4.创建自定义realm 1 2 3 4 5 @Bean public Realm getRealm () { return new CustomerRealm(); }
认证实现 1.编写login.jsp
1 2 3 4 5 <form action ="${pageContext.request.contextPath}/user/login" method ="post" > 用户名:<input type ="text" name ="username" > <br /> 密码 : <input type ="text" name ="password" > <br > <input type ="submit" value ="登录" > </form >
2.开发controller 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Controller @RequestMapping("user") public class UserController { @RequestMapping("login") public String login (String username,String password) { Subject subject = SecurityUtils.getSubject(); try { subject.login(new UsernamePasswordToken(username,password)); return "redirect:/index.jsp" ; } catch (UnknownAccountException e) { e.printStackTrace(); System.out.println("用户名错误!" ); }catch (IncorrectCredentialsException e){ e.printStackTrace(); System.out.println("密码错误!" ); } return "redirect:/login.jsp" ; } }
3.开发realm 1 2 3 4 5 6 7 8 9 10 @Override protected AuthenticationInfo doGetAuthenticationInfo (AuthenticationToken token) throws AuthenticationException { System.out.println("==========================" ); String principal = (String) token.getPrincipal(); if ("kylin" .equals(principal)){ return new SimpleAuthenticationInfo(principal,"123" ,this .getName()); } return null ; } }
当前只有以下用户信息
启动项目,登录成功!
认证功能没有md5和随机盐的认证就实现了
退出认证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Controller @RequestMapping("user") public class UserController { @RequestMapping("logout") public String logout () { Subject subject = SecurityUtils.getSubject(); subject.logout(); return "redirect:/login.jsp" ; } }
subject.logout();
退出用户
MD5、Salt的认证实现