Authenticator : 認證器,管理登入、登出mysql
Authorizer : 受權器,管理主體有哪些權限sql
Session Manager : session管理器數據庫
Session DAO : session的增刪改查緩存
Cache Manager : 緩存管理器session
Realms : shiro與數據源之間的橋樑,獲取認證信息、權限數據、角色數據都是經過realms獲取的ui
一、Shiro認證spa
建立SecurityManager->主體提交認證請求->SecurityManager認證->Authenticator認證->Realms驗證blog
SimpleAccountRealm繼承
DefaultSecurityManagertoken
SecurityUtils
UsernamePasswordToken
用戶名不正確:找不到用戶名異常
密碼不正確:不正確的憑證異常
subject.login(token);
subject.isAuthenticated();
二、Shiro受權
建立SecurityManager->主題受權->SecurityManager受權->Authorizer受權->Realm獲取角色權限數據
subject.checkRoles("admin","user1");
三、Realm
內置Realm:IniRealm JdbcRealm
IniRealm iniRealm = new IniRealm("classpath:user.ini");
subject.checkPermission("user:delete");
user.ini文件內容以下:
[Users]
Mark=123456,admin
[roles]
admin=user:delete,user:update
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUrl("jdbc:mysql://localhost:3306/test");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
jdbcRealm.setPermissionsLookupEnabled(true);
select password from users where username = ?
select passwork,password_salt from users where username = ?
select role_name from user_roles where username = ?
select permission from roles_permissions where role_name = ?
users表:id,username,password
user_roes表:id,Mark,admin
roles_permissions表:id,role_name,permission
JdbcRealm
String sql = "select password from test_user where user_name = ?";
jdbcRealm.setAuthenticationQuery(sql);
String roleSql = "select role_name from test_user_role where user_name = ?";
jdbcRealm.setUserRolesQuery(roleSql);
自定義受權,新增CustomRealm類,須要繼承AuthorizingRealm抽象類,實現它的抽象方法(這裏用集合模擬從數據庫/緩存中獲取數據)
SimpleAuthorizationInfo:受權信息
SimpleAuthenticationInfo:認證信息