Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、受權、密碼學和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。html
Apache Shiro 體系結構
一、Authentication 認證 ---- 用戶登陸
二、Authorization 受權 --- 用戶具備哪些權限
三、Cryptography 安全數據加密
四、Session Management 會話管理
五、Web Integration web系統集成
六、Interations 集成其它應用,spring、緩存框架java
一、導入對應的依賴
若是須要鏈接數據庫的話,別忘記導入相應的座標。程序員
這裏先看一眼對應的目錄結構
二、編寫controller類
在controller類裏面咱們能夠測試thymeleafweb
@RequestMapping("/testThymeleaf") public String testThymeleaf(Model model){ //把數據存入model model.addAttribute("name", "黑馬程序員"); //返回test.html return "test"; }
對應的主題部分:spring
/** * 登陸邏輯處理 */ @RequestMapping("/login") public String login(String name,String password,Model model){ System.out.println("name="+name); /** * 使用Shiro編寫認證操做 */ //1.獲取Subject Subject subject = SecurityUtils.getSubject(); //2.封裝用戶數據 UsernamePasswordToken token = new UsernamePasswordToken(name,password); //3.執行登陸方法 try { subject.login(token); //登陸成功 //跳轉到test.html return "redirect:/testThymeleaf"; } catch (UnknownAccountException e) { //e.printStackTrace(); //登陸失敗:用戶名不存在 model.addAttribute("msg", "用戶名不存在"); return "login"; }catch (IncorrectCredentialsException e) { //e.printStackTrace(); //登陸失敗:密碼錯誤 model.addAttribute("msg", "密碼錯誤"); return "login"; } }
三、Spring Boot與Shiro整合實現用戶認證
3.1分析Shiro的核心API
Subject: 用戶主體(把操做交給SecurityManager)
SecurityManager:安全管理器(關聯Realm)
Realm:Shiro鏈接數據的橋樑
3.2自定義Realm類數據庫
public class UserRealm extends AuthorizingRealm{ /** * 執行受權邏輯 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { System.out.println("執行受權邏輯"); //給資源進行受權 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //添加資源的受權字符串 //info.addStringPermission("user:add"); //到數據庫查詢當前登陸用戶的受權字符串 //獲取當前登陸用戶 Subject subject = SecurityUtils.getSubject(); User user = (User)subject.getPrincipal(); User dbUser = userSerivce.findById(user.getId()); info.addStringPermission(dbUser.getPerms()); return info; } @Autowired private UserService userSerivce; /** * 執行認證邏輯 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("執行認證邏輯"); //編寫shiro判斷邏輯,判斷用戶名和密碼 //1.判斷用戶名 UsernamePasswordToken token = (UsernamePasswordToken)arg0; User user = userSerivce.findByName(token.getUsername()); if(user==null){ //用戶名不存在 return null;//shiro底層會拋出UnKnowAccountException } //2.判斷密碼 return new SimpleAuthenticationInfo(user,user.getPassword(),""); }
3.3編寫Shiro配置類(*)緩存
@Configuration public class ShiroConfig { /** * 建立ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //設置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); //添加Shiro內置過濾器 /** * Shiro內置過濾器,能夠實現權限相關的攔截器 * 經常使用的過濾器: * anon: 無需認證(登陸)能夠訪問 * authc: 必須認證才能夠訪問 * user: 若是使用rememberMe的功能能夠直接訪問 * perms: 該資源必須獲得資源權限才能夠訪問 * role: 該資源必須獲得角色權限才能夠訪問 */ Map<String,String> filterMap = new LinkedHashMap<String,String>(); /*filterMap.put("/add", "authc"); filterMap.put("/update", "authc");*/ filterMap.put("/testThymeleaf", "anon"); //放行login.html頁面 filterMap.put("/login", "anon"); //受權過濾器 //注意:當前受權攔截後,shiro會自動跳轉到未受權頁面 filterMap.put("/add", "perms[user:add]"); filterMap.put("/update", "perms[user:update]"); filterMap.put("/*", "authc"); //修改調整的登陸頁面 shiroFilterFactoryBean.setLoginUrl("/toLogin"); //設置未受權提示頁面 shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); return shiroFilterFactoryBean; } /** * 建立DefaultWebSecurityManager */ @Bean(name="securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //關聯realm securityManager.setRealm(userRealm); return securityManager; } /** * 建立Realm */ @Bean(name="userRealm") public UserRealm getRealm(){ return new UserRealm(); } /** * 配置ShiroDialect,用於thymeleaf和shiro標籤配合使用 */ @Bean public ShiroDialect getShiroDialect(){ return new ShiroDialect(); }
3.4使用Shiro內置過濾器實現頁面攔截
代碼見上塊。。。
3.5實現用戶認證(登陸)操做安全
<!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>登陸頁面</title> </head> <body> <h3>登陸</h3> <h3 th:text="${msg}" style="color: red"></h3> <form method="post" action="login"> 用戶名:<input type="text" name="name"/><br/> 密碼:<input type="password" name="password"/><br/> <input type="submit" value="登陸"/> </form> </body> </html>
至於service層和mapper層,這裏不在贅述!
須要源碼的能夠在個人csdn裏面進行留言!!!網絡