記事のディレクトリ
説明:シンプルなプロジェクトと本稿では四郎の使用を説明するために、最後のプロジェクトは、ダウンロードの参考のため添付githubのに対処します。
史郎さんのプロフィール
史郎は、軽量のセキュリティフレームワークは、ユーザ認証とユーザー認証を含んでいます
史郎の機能:
認証(認証):ユーザの識別は、一般に、ユーザ「ログイン」と呼ばれる
アクセス制御:承認(認可)。例えば、ユーザが操作を使用する許可を持っている場合。
セッション管理(セッション管理):でも非EJBまたはWebアプリケーションにおけるユーザー固有のセッション管理、。
暗号化(暗号化):使いやすさを確保するために、データソースを暗号化する暗号化アルゴリズムを使用している間。
アプリケーションのセキュリティの4個の礎石の開発チームのシロフレームワークと呼ばれる以上の4点を、。
史郎アーキテクチャのコアAPI:
件名:ユーザープリンシパル(セキュリティマネージャへの操作)
のSecurityManagerセキュリティマネージャは、(すべての被験者の管理は、セキュリティマネージャは傘を形成するために一緒に内部安全コンポーネントと、四郎コアアーキテクチャである。)
Reaml:ブリッジは、自然界にはデータ接続四郎です特定のセキュリティは、データ・ソース接続の詳細をカプセル化DAOは、シロに関連する必要なデータを取得します。これは、データベース、クエリログイン、パスワード、権限などを動作させることです
史郎の設定クラス:
ShiroFilterFactoryBeanを作成し、(ブロックされている必要はありませんインターセプトに配置されるようにパスを必要史郎インターセプタは、)
DefaultWebSecurityManagerを作成し、(レルムを設定するための)
Reaml(AuthorizingReamlを継承)を作成しました。
史郎は、内蔵のフィルタは、関係当局のインターセプタを達成することができます:
共通のフィルタ:
安野:いいえ認証(ログイン)缶アクセス
authcは:アクセスの認証を取得しなければならない
ユーザーを:あなたはリメンバー・ミー機能を使用している場合は、直接アクセスすることはできない
パーマを:リソースはリソースでなければなりませんがアクセスできる
役割を:リソースがアクセスする役割の権限である必要があります
史郎使用:
:史郎を使用する場合は、まずどのような私たちの手順を決定する必要があります
。1. [追加]史郎依存関係
; 2.領域は、そのクラス(継承AuthorizingRealmによってクラス)を達成
3.史郎実装された構成クラス
4実施ログインインターフェースのフロントエンドをそしてコントローラクラスの作成
最初のステップ:のpom.xmlに追加の依存関係
<!--添加shiro支持-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
ステップ2:カスタムクラスを作成しますMYREALM
私たちは、カスタムクラスMYREALM継承AuthorizingRealm書き換えdoGetAuthenticationInfoとdoGetAuthorizationInfoメソッドを作成する必要があります。ユーザーを認証するために使用されDoGetAuthenticationInfoは、doGetAuthorizationInfoは、ユーザーがそのようなリンク、リソースファイルにアクセスすると、この操作を行うことが許可されていることを証明するために、操作するユーザーの権限のアクセス制御を承認しました。
/**
* 自定义Realm
*
*/
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private RoleMenuMapper roleMenuMapper;
@Autowired
private MenuMapper menuMapper;
@Autowired
private RoleMapper roleMapper;
/**
* 授权--验证url
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//获取当前登录的用户名
String name = (String) SecurityUtils.getSubject().getPrincipal();
// 有了用户就可以拿到对应的角色,有角色就可以拿到对应的菜单
User user = userService.findByName(name);
// 这个角色对应 的菜单,先用roleId查找角色和菜单的关联表,再用关联表中的menuId查找对应的menu对象,
// 再.getPermissions找出权限名
List<RoleMenu> roleMenuList = roleMenuMapper.findByRoleId(user.getRoleId());//查出所有角色关联的菜单
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
for (RoleMenu roleMenu : roleMenuList) {
info.addStringPermission(menuMapper.findById(roleMenu.getMenuId()).getPermissions());// 添加权限
}
// 设置角色
Set<String> roles = new HashSet<String>();
roles.add(roleMapper.findById(user.getRoleId()).getName());
info.setRoles(roles);
return info;
}
/**
* 权限认证--登录
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String name = (String) token.getPrincipal();// 拿到的是用户名 就是UsernamePasswordTokenr的第一个参数 name
User user = userService.findByName(name);// 根据name找到数据库中的user实体
if (user != null) {// 这里的一步主要是来判断密码是否正确
/**
* 对于传的三个参数
* Object principal:可以传username或者user对象都可以
* Object credentials:用户密码:注意这里是指从数据库中获取的password
* String realmName:即当前realm的名称(个人尝试:随便传个字符串就行,但不能为null,具体不太明白)
*/
return new SimpleAuthenticationInfo(user.getName(), user.getPwd(), "MyRealm");
} else {
return null;
}
}
}
ステップ3:史郎の設定クラスを作成します。
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//必须设置设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//设置没有登录时跳转的页面
//如果不设置默认会自动寻找web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login");
/**
* 登录成功后要跳转的链接
* 一般shiro验证成功后,我们需要执行一些操作,比如:缓存用户信息到session,返回页面一些信息等操作
* 所以,不需要shiro来跳转
*/
//shiroFilterFactoryBean.setSuccessUrl("/index");
/**
* 添加拦截器:
* 常用内置过滤器
* anon:无需认证(登录)用户可以直接访问(就相当于游客)
* authc:必须要认证才能访问
* user:使用了remenberMe的功能的用户可以直接无需登录访问(相当于记住登录状态)
* perms:必须获取资源权限才能访问
* role:必须获取角色授权才能访问
* logout:用户登出,这里不用设置控制器,退出后直接跳转到/
*/
Map<String,String> filterMap = new LinkedHashMap<String,String>();
//配置不会被拦截的链接 顺序判断 anon:所有的url都可以匿名访问
filterMap.put("/static/**","anon");
filterMap.put("/user/login","anon");
//配置退出过滤器,其中具体的实现shiro已经替我们实现了
filterMap.put("/logout", "logout");
//authc:所有url需要认证才能访问
filterMap.put("/admin/**", "authc");
filterMap.put("/houtai/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
/**
* 创建 安全管理器 SecurityManager
* @return
*/
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm
securityManager.setRealm(myRealm());
return securityManager;
}
/**
* 身份认证realm;(这个需要自己写,账号密码校验,权限等)
* @return
*/
@Bean
public MyRealm myRealm(){
return new MyRealm();
}
/**
* shiro生命周期处理器
* @return
*/
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* 开启shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助springAOP扫描使用
* shiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean即可实现此功能
* @return
*/
@Bean
@DependsOn({"lifecycleBeanPostProcessor"})
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
return authorizationAttributeSourceAdvisor;
}
/**
* 配置 ShiroDialect 用于thymeleaf 和shiro标签配合使用
* @return
*/
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}
ステップ4:フロントエンドのログイン画面を実装し、コントローラクラスを記述します。
プロジェクトだったもののようなインタフェースは、持っているので、注釈はありませんここにショーで、また、より包括的です。
プロジェクト住所:
https://github.com/isczy/BookSystem.git
史郎実装プロセス
1.プロジェクトを開始し、それはコンフィギュレーションクラスShiroConfigをロードします
2.ユーザー名とパスワードを入力し、持ってログインをクリックしてsubject.login(token);
操作を、それが自動的に必須SecurityUtils.setSecurityManager()の設定を呼び出す前に、セキュリティマネージャに委託します
実際の認証ロジックを担当する3.SecurityManager;認証を認証するために委託されます
4.Authenticatorはノーリターン/例外が失敗した認証によってスローされていないが存在する場合、レルムは、本人確認情報を取得し、適切なトークンの着信レルムを置きます。ここでは、複数のレルムを設定することができ、対応する順序や戦略にアクセスされます。
5. doGetAuthenticationInfoレルムを行う方法は、認証用のカスタム、ユーザー名とパスワードを書き換えます。終了し通常の実行に戻り、それは検証が成功であることを示しています。それ以外の場合は例外:UnknownAccountException:パスワードエラー:ユーザ名ではない/ IncorrectCredentialsExceptionのが存在します
場合は、アドレス4. Accessプロジェクト、ユーザーが権限を持っているかどうかを確認するために、URLを確認するために認可され、書き換えられたカスタムレルムにdoGetAuthorizationInfoメソッドを実行します
史郎認証プロセスマップ
史郎承認プロセスマップ
最後に、記事のプロジェクトアドレスの末尾を添付:
https://github.com/isczy/BookSystem.git